Bu makale, Laravel subdomain yönlendirmelerinde URL oluşturmanın pratik bir yolunu ele alıyor.
Sorun
Sorun
Bir subdomain altında bir rota kaydedildiğinde:
Route::middleware([])->domain('foo.com')->group(function () {
Route::get('/test', function () {
return [
'current' => url('test'), // returns https://foo.com/test
];
});
});
Bu bağlamda, hem url() hem de route() subdomain ile URL’ler üretir. Ancak, eğer ana siteye (app.url) bir URL ihtiyacınız varsa, bunun üstesinden gelmeniz gerekir.
Neden Doğrudan Değiştiremiyorsunuz?
Neden Doğrudan Değiştiremiyorsunuz?
app(UrlGenerator::class) kodu, konteynerden bir singleton döner. Bunun kökenini değiştirmek, istekteki tüm url() çağrılarını etkiler — middleware, cevaplar, her şey. Bu istenmeyen bir yan etkidir.
Çözüm: Clone ve useOrigin Kullan
Çözüm: Clone ve useOrigin Kullan
Route::get('/test', function () {
// Bir kopyasını klonla — orijinal singleton değiştirilmeden kalır
$urlGenerator = clone app(UrlGenerator::class);
// Klonun kökenini app.url (ana site) olarak ayarla
$urlGenerator->useOrigin(config('app.url'));
return [
'origin' => $urlGenerator->to(), // https://localhost/test (ana site)
'current' => url(), // https://foo.com/test (subdomain, değiştirilmeden)
];
});
Çıktı:
{
"origin": "https://localhost/test",
"current": "https://foo.com/test"
}
clone, iki UrlGenerator örneğini bağımsız hale getirir. useOrigin() yalnızca klonlanmış kopyayı etkiler. Global url() yardımcıları tamamen etkilenmez.
Testte Doğrulama
Testte Doğrulama
Test yazarken doğrudan çıktıyı kontrol etmek için dump() kullanabilirsiniz:
it(, function () {
Route::middleware([])->domain()->group(function () {
Route::get(, function () {
$urlGenerator = clone app(UrlGenerator::class);
$urlGenerator->useOrigin(config());
return [
=> $urlGenerator->to(),
=> url(),
];
})->name();
});
$response = getJson();
$response->assertJson([
=> ,
=> ,
]);
});
Gerçek Dünya Kullanım Senaryoları
Gerçek Dünya Kullanım Senaryoları
E-posta Gönderimi: Kullanıcı tenant.app.com üzerinde, ancak e-postadaki bağlantılar app.com adresine yönlendirilmelidir.
// Bir subdomain kontrolöründe
public function sendWelcomeEmail(User $user): void
{
$urlGenerator = clone app(UrlGenerator::class);
$urlGenerator->useOrigin(config());
$loginUrl = $urlGenerator->route(); // https://app.com/login, subdomain yok
Mail::to($user)->send(new WelcomeMail($loginUrl));
}
API yanıtları ile kanonik bağlantılar: Çoklu kiracı mimarisinde, API yanıtlarında kanonik URL’ler veya yönlendirme bağlantıları ana siteyi işaret etmelidir, kiracının subdomainini değil.
useOrigin Ne Yapar?
useOrigin Ne Yapar?
useOrigin(), URL oluştururken kullanılan şemayı ve ana makineyi ayarlayan bir UrlGenerator yöntemidir. Route’un domain kısıtlamasını değiştirmez — yalnızca sonuçtaki URL dizesinin köken kısmını değiştirir.
// Etkisi içsel olarak buna benzer
public function useOrigin(string $origin): static
{
[$this->forceScheme,$host] = explode(,$origin);
$this->forceRootUrl($origin);
return $this;
}
clone, bu değişikliğin yalnızca o bir örnekte yaşamasını sağlar. Alan dışına çıktığında, değişiklik kaybolur. Global durum kirliliği yoktur.
Özet
Özet
Bir subdomain rotasında bir kök alan URL’sine ihtiyacınız olduğunda, clone app(UrlGenerator::class) ardından useOrigin() en temiz yaklaşımdır. Geçici yapılandırma değişiklikleri yok, URL::forceRootUrl() (bu global), manuel dize birleştirme yok.
Kaynaklar
Kaynaklar
Kaynak: Orijinal Makale


