تولید URL
معرفی
لاراول چندین کمک کننده برای کمک به شما در ایجاد URL برای برنامه خود ارائه می دهد. این موارد عمدتاً هنگام ایجاد پیوند در قالبها و پاسخهای API یا هنگام ایجاد پاسخهای تغییر مسیر به بخش دیگری از برنامه شما مفید هستند.
اصول اولیه
ایجاد URL های پایه
کمک
url
کننده ممکن است برای تولید URL های دلخواه برای برنامه شما استفاده شود.
URL تولید شده به طور خودکار از طرح (HTTP یا HTTPS) و میزبان درخواست فعلی
استفاده می کند:
$post = App\Post::find(1); echo url("/posts/{$post->id}"); // http://example.com/posts/1
دسترسی به URL فعلی
اگر مسیری به کمک کننده ارائه نشود
url
، یک
Illuminate\Routing\UrlGenerator
نمونه برگردانده می شود که به شما امکان می دهد به اطلاعات مربوط به URL
فعلی دسترسی داشته باشید:
// 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();
URL
به هر یک از این روش ها می توان از طریق نما
نیز دسترسی داشت
:
use Illuminate\Support\Facades\URL; echo URL::current();
URL برای مسیرهای نامگذاری شده
کمک
route
کننده ممکن است برای تولید URL به مسیرهای نامگذاری شده استفاده شود.
مسیرهای نامگذاری شده به شما این امکان را می دهند که URL ها را بدون جفت
شدن به URL واقعی تعریف شده در مسیر ایجاد کنید.
بنابراین، اگر URL مسیر تغییر کند، نیازی به تغییر در
route
فراخوانی تابع شما نیست.
به عنوان مثال، تصور کنید برنامه شما حاوی مسیری است که به صورت زیر تعریف
شده است:
Route::get('/post/{post}', function () { //})->name('post.show');
برای ایجاد URL به این مسیر، می توانید از
route
راهنما مانند زیر استفاده کنید:
echo route('post.show', ['post' => 1]); // http://example.com/post/1
شما اغلب URL ها را با استفاده از کلید اصلی مدل های Eloquent
ایجاد می کنید
.
به همین دلیل، می توانید مدل های Eloquent را به عنوان مقادیر پارامتر ارسال
کنید.
کمک
route
کننده به طور خودکار کلید اصلی مدل را استخراج می کند:
echo route('post.show', ['post' => $post]);
کمک
route
کننده همچنین ممکن است برای تولید URL برای مسیرهایی با پارامترهای متعدد
استفاده شود:
Route::get('/post/{post}/comment/{comment}', function () { //})->name('comment.show'); echo route('comment.show', ['post' => 1, 'comment' => 3]); // http://example.com/post/1/comment/3
آدرس های اینترنتی امضا شده
لاراول به شما اجازه می دهد تا به راحتی URL های "امضا" را برای مسیرهای نامگذاری شده ایجاد کنید. این URL ها دارای یک هش "امضا" هستند که به رشته پرس و جو اضافه شده است که به لاراول اجازه می دهد تا بررسی کند که URL از زمان ایجاد تغییر نکرده است. URL های امضا شده مخصوصاً برای مسیرهایی مفید هستند که عموماً در دسترس هستند اما به لایه ای از محافظت در برابر دستکاری URL نیاز دارند.
به عنوان مثال، ممکن است از URL های امضا شده برای پیاده سازی پیوند عمومی
"لغو اشتراک" استفاده کنید که برای مشتریان شما ایمیل می شود.
برای ایجاد یک URL امضا شده برای یک مسیر نامگذاری شده، از
signedRoute
روش نما استفاده کنید
URL
:
use Illuminate\Support\Facades\URL; return URL::signedRoute('unsubscribe', ['user' => 1]);
اگر می خواهید یک URL مسیر امضا شده موقت ایجاد کنید که منقضی می شود، می
توانید از
temporarySignedRoute
روش زیر استفاده کنید:
use Illuminate\Support\Facades\URL; return URL::temporarySignedRoute( 'unsubscribe', now()->addMinutes(30), ['user' => 1]);
اعتبار سنجی درخواست های مسیر امضا شده
برای تأیید اینکه یک درخواست ورودی دارای امضای معتبر است، باید
hasValidSignature
متد موجود در ورودی را فراخوانی کنید
Request
:
use Illuminate\Http\Request; Route::get('/unsubscribe/{user}', function (Request $request) { if (! $request->hasValidSignature()) { abort(401); } // ...})->name('unsubscribe');
از طرف دیگر، می توانید
Illuminate\Routing\Middleware\ValidateSignature
میان افزار را به مسیر اختصاص دهید.
اگر قبلاً وجود ندارد، باید به این میان افزار یک کلید در
routeMiddleware
آرایه هسته HTTP خود اختصاص دهید:
/** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */protected $routeMiddleware = [ 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,];
هنگامی که میان افزار را در هسته خود ثبت کردید، می توانید آن را به یک مسیر
متصل کنید.
اگر درخواست دریافتی دارای امضای معتبر نباشد، میان افزار به طور خودکار یک
403
پاسخ خطا را برمی گرداند:
Route::post('/unsubscribe/{user}', function (Request $request) { // ...})->name('unsubscribe')->middleware('signed');
URL ها برای اقدامات کنترلر
تابع
action
یک URL برای عملکرد کنترلر داده شده ایجاد می کند.
نیازی نیست فضای نام کامل کنترلر را پاس کنید.
در عوض، نام کلاس کنترلر را نسبت به
App\Http\Controllers
فضای نام ارسال کنید:
$url = action('HomeController@index');
همچنین میتوانید به اقداماتی با یک نحو آرایه «قابل فراخوانی» ارجاع دهید:
use App\Http\Controllers\HomeController; $url = action([HomeController::class, 'index']);
اگر متد کنترلر پارامترهای مسیر را بپذیرد، می توانید آنها را به عنوان آرگومان دوم به تابع ارسال کنید:
$url = action('UserController@profile', ['id' => 1]);
مقادیر پیش فرض
برای برخی از برنامهها، ممکن است بخواهید مقادیر پیشفرض درخواستی را برای
پارامترهای URL خاص مشخص کنید.
به عنوان مثال، تصور کنید بسیاری از مسیرهای شما یک
{locale}
پارامتر را تعریف می کنند:
Route::get('/{locale}/posts', function () { //})->name('post.index');
دست و پا گیر است که همیشه
locale
هر بار که با کمک تماس می گیرید عبور کنید
route
.
بنابراین، می توانید از
URL::defaults
روش برای تعریف یک مقدار پیش فرض برای این پارامتر استفاده کنید که همیشه در
طول درخواست فعلی اعمال می شود.
ممکن است بخواهید این روش را از
میان افزار مسیر
فراخوانی کنید تا به درخواست فعلی دسترسی داشته باشید:
<?php namespace App\Http\Middleware; use Closure;use Illuminate\Support\Facades\URL; class SetDefaultLocaleForUrls{ public function handle($request, Closure $next) { URL::defaults(['locale' => $request->user()->locale]); return $next($request); }}
هنگامی که مقدار پیشفرض پارامتر
locale
تنظیم شد، دیگر لازم نیست مقدار آن را هنگام تولید URL از طریق
route
Helper ارسال کنید.