serefayazgun Tüm rotalara bir isim verin ve domaine göre gruplarken domaini de (uzantısı hariç) prefix olarak verin:
Route::domain('domain1.com')
->prefix('domain1.')
->group(base_path('routes/domain1.php'));
Route::domain('domain2.com')
->prefix('domain2.')
->group(base_path('routes/domain2.php'));
Böylece mesela routes/domain1.php içinde şöyle olacak:
Route::get('users', UserController::class)
->name('users.index'); // rota ismi artık users.index değil domain1.users.index
Normalde isimi rotalara erişmek için biz route('users.index')
kullanıyoruz ama sizin şimdi bunun başına otomatik domain1. getirmeniz lazım. Yani route('users.index') yazınca size domain1.users.index isimli rotayı vermesi lazım. route() yöntemi arka planda Illuminate\Routing\UrlGenerator kullanıyor, ona bir tane macro yazabiliriz:
AppServiceProvider::boot() içine:
UrlGenerator::macro('routeDomain', function (string $name, array $parameters = [], bool $absolute = true) {
$domain = array_slice(
explode('.', Request::host()),
-2, 1
)[0];
return route($domain.'.'.$name, $parameters, $absolute);
});
Artık URL::routeDomain('users.index')
ya da url()->routeDomain('users.index')
olarak kullanabilirsiniz. Bu site otomatik olarak hangi domain aktif ise onun users.index rotasını verecek. route() yöntemine benzesin istiyorsanız, mesela route_domain()
gibi, ona bir tane helper yazabilirsiniz:
if (!function_exists('route_domain')) {
function route_domain(string $name, array $parameters = [], bool $absolute = true) {
return URL::routeDomain($name, $parameters, $absolute);
}
}
NOT:
Şimdi farkettim de, prefix olarak aslında domain1.com. şeklinde uzantılı da kullanabilirsiniz. Ben nedense sadece domain1 kısmını almaya odaklanmıştım. Bu domain1.com ve domain1.net olan durumlarda çalışmayacaktır. O yüzden siz o şekilde kodu düzenlersiniz.