URL yardımcısı ile URL oluşturma süreçleri
URL yardımcısı, uygulamanız için keyfi URL'ler oluşturmak için kullanılabilir. Oluşturulan URL, uygulama tarafından işlenen geçerli istekten gelen şemayı (HTTP veya HTTPS) ve ana bilgisayarı otomatik olarak kullanacaktır:
$post = App\Models\Post::find(1);
echo url("/posts/{$post->id}");
// http://example.com/posts/1Sorgu dizesi parametreleriyle bir URL oluşturmak için sorgu yöntemini kullanabilirsiniz:echo url()->query('/posts', ['search' => 'Laravel']);
// https://example.com/posts?search=Laravel
echo url()->query('/posts?sort=latest', ['search' => 'Laravel']);
// http://example.com/posts?sort=latest&search=LaravelYolda zaten mevcut olan sorgu dizesi parametrelerinin sağlanması, mevcut değerlerinin üzerine yazacaktır:echo url()->query('/posts?sort=latest', ['sort' => 'oldest']);
// http://example.com/posts?sort=oldestecho url()->query('/posts?sort=latest', ['sort' => 'oldest']);
// http://example.com/posts?sort=oldestDeğer dizileri de sorgu parametreleri olarak geçirilebilir. Bu değerler, oluşturulan URL'de düzgün bir şekilde anahtarlanacak ve kodlanacaktır:echo $url = url()->query('/posts', ['columns' => ['title', 'body']]);
// http://example.com/posts?columns%5B0%5D=title&columns%5B1%5D=body
echo urldecode($url);
// http://example.com/posts?columns[0]=title&columns[1]=bodyMevcut URL'ye Erişim SüreçleriURL yardımcısına bir yol sağlanmazsa, geçerli URL hakkında bilgilere erişmenizi sağlayan bir IlluminateRoutingUrlGenerator örneği döndürülür:
// Get the current URL without the query string... echo url()->current(); // Get the current URL including the query string... echo url()->full(); // Get the full URL for the previous request... echo url()->previous(); // Get the path for the previous request... echo url()->previousPath();Bu yöntemlerin her birine URL cephesi üzerinden de erişilebilir:
use Illuminate\Support\Facades\URL; echo URL::current();Adlandırılmış Rotalar için URL'ler
Rota yardımcısı, adlandırılmış rotalara URL'ler üretmek için kullanılabilir. Adlandırılmış rotalar, rotada tanımlanan gerçek URL'ye bağlanmadan URL'ler üretmenize olanak tanır. Bu nedenle, rotanın URL'si değişirse, rota işlevine yaptığınız çağrılarda hiçbir değişiklik yapılması gerekmez. Örneğin, uygulamanızın aşağıdaki gibi tanımlanmış bir rota içerdiğini düşünün:
Route::get('/post/{post}', function (Post $post) {
// ...
})->name('post.show');Bu rotaya bir URL oluşturmak için rota yardımcısını şu şekilde kullanabilirsiniz:echo route('post.show', ['post' => 1]);
// http://example.com/post/1Elbette, rota yardımcısı aynı zamanda birden fazla parametreye sahip rotalar için URL'ler üretmek amacıyla da kullanılabilir:Route::get('/post/{post}/comment/{comment}', function (Post $post, Comment $comment) {
// ...
})->name('comment.show');
echo route('comment.show', ['post' => 1, 'comment' => 3]);
// http://example.com/post/1/comment/3Rotanın tanımlama parametrelerine uymayan herhangi bir ek dizi öğesi URL'nin sorgu dizesine eklenecektir:echo route('post.show', ['post' => 1, 'search' => 'rocket']);
// http://example.com/post/1?search=rocketEloquent ModellerURL'leri genellikle Eloquent modellerinin rota anahtarını (genellikle birincil anahtar) kullanarak üreteceksiniz. Bu nedenle, Eloquent modellerini parametre değerleri olarak geçirebilirsiniz. Rota yardımcısı modelin rota anahtarını otomatik olarak çıkaracaktır:
echo route('post.show', ['post' => $post]);İmzalanmış URL'ler (Signed URLs)Laravel, adlandırılmış rotalara "imzalanmış" URL'leri kolayca oluşturmanıza olanak tanır. Bu URL'lerin sorgu dizesine eklenen bir "imza" karması vardır ve bu da Laravel'in URL'nin oluşturulduğundan beri değiştirilmediğini doğrulamasını sağlar. İmzalanmış URL'ler, özellikle herkese açık ancak URL manipülasyonuna karşı bir koruma katmanına ihtiyaç duyan rotalar için kullanışlıdır. Örneğin, müşterilerinize e-postayla gönderilen genel bir "abonelikten çıkma" bağlantısı uygulamak için imzalı URL'ler kullanabilirsiniz. Adlandırılmış bir rotaya imzalı bir URL oluşturmak için URL cephesinin signedRoute yöntemini kullanın:
use Illuminate\Support\Facades\URL;
return URL::signedRoute('unsubscribe', ['user' => 1]);signedRoute yöntemine mutlak argüman sağlayarak etki alanını imzalanmış URL karma değerinden hariç tutabilirsiniz:return URL::signedRoute('unsubscribe', ['user' => 1], absolute: false);Belirli bir süre sonra süresi dolan geçici bir imzalı rota URL'si oluşturmak istiyorsanız, temporarySignedRoute yöntemini kullanabilirsiniz. Laravel geçici bir imzalı rota URL'sini doğruladığında, imzalı URL'ye kodlanmış olan süre sonu zaman damgasının geçmediğinden emin olur:use Illuminate\Support\Facades\URL;
return URL::temporarySignedRoute(
'unsubscribe', now()->addMinutes(30), ['user' => 1]
);İmzalanmış Rota İsteklerinin DoğrulanmasıGelen bir isteğin geçerli bir imzaya sahip olduğunu doğrulamak için, gelen IlluminateHttpRequest örneğinde hasValidSignature yöntemini çağırmalısınız:
use Illuminate\Http\Request;
Route::get('/unsubscribe/{user}', function (Request $request) {
if (! $request->hasValidSignature()) {
abort(401);
}
// ...
})->name('unsubscribe');Bazen, istemci tarafı sayfalandırma gerçekleştirirken olduğu gibi, uygulamanızın ön ucunun imzalanmış bir URL'ye veri eklemesine izin vermeniz gerekebilir. Bu nedenle, hasValidSignatureWhileIgnoring yöntemini kullanarak imzalanmış bir URL'yi doğrularken yok sayılması gereken istek sorgu parametrelerini belirtebilirsiniz. Unutmayın, parametreleri yok saymak, herkesin istekteki bu parametreleri değiştirmesine izin verir:if (! $request->hasValidSignatureWhileIgnoring(['page', 'order'])) {
abort(401);
}Gelen istek örneğini kullanarak imzalanmış URL'leri doğrulamak yerine, rotaya imzalanmış (IlluminateRoutingMiddlewareValidateSignature) ara yazılımını atayabilirsiniz. Gelen istekte geçerli bir imza yoksa, ara yazılım otomatik olarak bir 403 HTTP yanıtı döndürecektir:Route::post('/unsubscribe/{user}', function (Request $request) {
// ...
})->name('unsubscribe')->middleware('signed');İmzalı URL'leriniz URL karmasında alan adını içermiyorsa, ara yazılıma göreli argümanı sağlamalısınız:Route::post('/unsubscribe/{user}', function (Request $request) {
// ...
})->name('unsubscribe')->middleware('signed:relative');Geçersiz İmzalanmış Rotalara Yanıt VermeBirisi süresi dolmuş imzalı bir URL'yi ziyaret ettiğinde, 403 HTTP durum kodu için genel bir hata sayfası alır. Ancak, uygulamanızın bootstrap/app.php dosyasında InvalidSignatureException istisnası için özel bir "render" kapanışı tanımlayarak bu davranışı özelleştirebilirsiniz:
use Illuminate\Routing\Exceptions\InvalidSignatureException;
->withExceptions(function (Exceptions $exceptions) {
$exceptions->render(function (InvalidSignatureException $e) {
return response()->view('errors.link-expired', status: 403);
});
})Denetleyici Eylemleri için URL'lerEylem fonksiyonu, belirtilen denetleyici eylemi için bir URL üretir:
use App\Http\Controllers\HomeController; $url = action([HomeController::class, 'index']);Denetleyici yöntemi rota parametrelerini kabul ediyorsa, fonksiyona ikinci argüman olarak rota parametrelerinin ilişkisel bir dizisini geçirebilirsiniz:
$url = action([UserController::class, 'profile'], ['id' => 1]);Varsayılan Değerler
Bazı uygulamalar için, belirli URL parametreleri için istek genelinde varsayılan değerler belirtmek isteyebilirsiniz. Örneğin, rotalarınızın çoğunun bir {locale} parametresi tanımladığını düşünün:
Route::get('/{locale}/posts', function () {
// ...
})->name('post.index');Her seferinde rota yardımcısını çağırdığınızda yerel ayarı her zaman geçirmek zahmetlidir. Bu nedenle, geçerli istek sırasında her zaman uygulanacak bu parametre için varsayılan bir değer tanımlamak üzere URL::defaults yöntemini kullanabilirsiniz. Geçerli isteğe erişebilmeniz için bu yöntemi bir rota ara yazılımından çağırmak isteyebilirsiniz:<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\URL;
use Symfony\Component\HttpFoundation\Response;
class SetDefaultLocaleForUrls
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
URL::defaults(['locale' => $request->user()->locale]);
return $next($request);
}
}Yerel ayar parametresinin varsayılan değeri ayarlandıktan sonra, rota yardımcısı aracılığıyla URL'ler oluştururken artık bu değeri geçirmeniz gerekmez.URL Varsayılanları ve Ara Yazılım Önceliği
URL varsayılan değerlerini ayarlamak, Laravel'in örtük model bağlamalarını ele alış biçimini etkileyebilir. Bu nedenle, URL varsayılanlarını Laravel'in kendi SubstituteBindings ara yazılımından önce çalıştırılacak şekilde ayarlayan ara yazılımınıza öncelik vermelisiniz. Bunu, uygulamanızın bootstrap/app.php dosyasındaki öncelikli ara yazılım yöntemini kullanarak başarabilirsiniz:
->withMiddleware(function (Middleware $middleware) {
$middleware->prependToPriorityList(
before: \Illuminate\Routing\Middleware\SubstituteBindings::class,
prepend: \App\Http\Middleware\SetDefaultLocaleForUrls::class,
);
})