تولید URL
معرفی
لاراول چندین کمک کننده برای کمک به شما در ایجاد URL برای برنامه خود ارائه می دهد. این کمکها در درجه اول هنگام ایجاد پیوند در قالبها و پاسخهای API یا هنگام ایجاد پاسخهای تغییر مسیر به قسمت دیگری از برنامه شما مفید هستند.
اصول اولیه
ایجاد URL
کمک
url
کننده ممکن است برای تولید URL های دلخواه برای برنامه شما استفاده شود.
URL تولید شده به طور خودکار از طرح (HTTP یا HTTPS) و میزبان درخواست فعلی
که توسط برنامه مدیریت می شود استفاده می کند:
$post = App\Models\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 برای مسیرهای نامگذاری شده
کمک کننده ممکن است برای تولید URL به
مسیرهای نامگذاری شده
route
استفاده شود
.
مسیرهای نامگذاری شده به شما این امکان را می دهند که URL ها را بدون جفت
شدن به URL واقعی تعریف شده در مسیر ایجاد کنید.
بنابراین، اگر URL مسیر تغییر کند، نیازی به تغییر در تماس های شما با
عملکرد نیست
.
به عنوان مثال، تصور کنید برنامه شما حاوی مسیری است که به صورت زیر تعریف
شده است:
route
Route::get('/post/{post}', function (Post $post) { //})->name('post.show');
برای ایجاد URL به این مسیر، می توانید از
route
راهنما مانند زیر استفاده کنید:
echo route('post.show', ['post' => 1]); // http://example.com/post/1
البته،
route
کمک کننده ممکن است برای تولید URL برای مسیرهایی با پارامترهای متعدد نیز
استفاده شود:
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/3
هر عنصر آرایه اضافی که با پارامترهای تعریف مسیر مطابقت ندارد به رشته پرس و جو URL اضافه می شود:
echo route('post.show', ['post' => 1, 'search' => 'rocket']); // http://example.com/post/1?search=rocket
مدل های الکوئنت
شما اغلب با استفاده از کلید مسیر (معمولاً کلید اصلی) مدلهای Eloquent
URL تولید میکنید
.
به همین دلیل، می توانید مدل های Eloquent را به عنوان مقادیر پارامتر ارسال
کنید.
کمک
route
کننده به طور خودکار کلید مسیر مدل را استخراج می کند:
echo route('post.show', ['post' => $post]);
آدرس های اینترنتی امضا شده
لاراول به شما اجازه می دهد تا به راحتی URL های "امضا" را برای مسیرهای نامگذاری شده ایجاد کنید. این URL ها دارای یک هش "امضا" هستند که به رشته پرس و جو اضافه شده است که به لاراول اجازه می دهد تا بررسی کند که URL از زمان ایجاد تغییر نکرده است. URL های امضا شده مخصوصاً برای مسیرهایی مفید هستند که عموماً در دسترس هستند اما به لایه ای از محافظت در برابر دستکاری URL نیاز دارند.
به عنوان مثال، ممکن است از URL های امضا شده برای پیاده سازی پیوند عمومی
"لغو اشتراک" استفاده کنید که برای مشتریان شما ایمیل می شود.
برای ایجاد یک URL امضا شده برای یک مسیر نامگذاری شده، از
signedRoute
روش نما استفاده کنید
URL
:
use Illuminate\Support\Facades\URL; return URL::signedRoute('unsubscribe', ['user' => 1]);
اگر می خواهید یک URL مسیر امضا شده موقت ایجاد کنید که پس از مدت زمان
مشخصی منقضی می شود، می توانید از این
temporarySignedRoute
روش استفاده کنید.
وقتی لاراول یک URL مسیر امضا شده موقت را تأیید می کند، اطمینان حاصل می
کند که مهر زمانی انقضا که در URL امضا شده کدگذاری شده است، سپری نشده است:
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
پاسخ HTTP برمی گرداند:
Route::post('/unsubscribe/{user}', function (Request $request) { // ...})->name('unsubscribe')->middleware('signed');
پاسخ به مسیرهای امضا شده نامعتبر
هنگامی که شخصی از یک URL امضا شده بازدید می کند که منقضی شده است، یک صفحه
خطای عمومی برای کد وضعیت HTTP دریافت می کند
403
.
با این حال، میتوانید این رفتار را با تعریف یک بسته «قابل اجرا» سفارشی
برای
InvalidSignatureException
استثنا در کنترلکننده استثنا خود سفارشی کنید.
این بسته شدن باید یک پاسخ HTTP برگرداند:
use Illuminate\Routing\Exceptions\InvalidSignatureException; /** * Register the exception handling callbacks for the application. * * @return void */public function register(){ $this->renderable(function (InvalidSignatureException $e) { return response()->view('error.link-expired', [], 403); });}
URL ها برای اقدامات کنترلر
تابع
action
یک URL برای عملکرد کنترلر داده شده ایجاد می کند:
use App\Http\Controllers\HomeController; $url = action([HomeController::class, 'index']);
اگر متد کنترلر پارامترهای مسیر را بپذیرد، می توانید یک آرایه ارتباطی از پارامترهای مسیر را به عنوان آرگومان دوم به تابع ارسال کنید:
$url = action([UserController::class, '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{ /** * Handle the incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return \Illuminate\Http\Response */ public function handle($request, Closure $next) { URL::defaults(['locale' => $request->user()->locale]); return $next($request); }}
هنگامی که مقدار پیشفرض پارامتر
locale
تنظیم شد، دیگر لازم نیست مقدار آن را هنگام تولید URL از طریق
route
Helper ارسال کنید.
پیشفرضهای URL و اولویت میانافزار
تنظیم مقادیر پیشفرض URL میتواند در مدیریت لاراول از اتصالات مدل ضمنی
اختلال ایجاد کند.
بنابراین، باید
میانافزار خود را
که پیشفرض URLها را قبل از میانافزار لاراول اجرا میکند، اولویت بندی
کنید
SubstituteBindings
.
شما میتوانید این کار را با اطمینان از اینکه میانافزار شما قبل از
SubstituteBindings
میانافزار درون
$middlewarePriority
ویژگی هسته HTTP برنامهتان وجود دارد، انجام دهید.
ویژگی
$middlewarePriority
در کلاس پایه تعریف شده است
Illuminate\Foundation\Http\Kernel
.
می توانید تعریف آن را از آن کلاس کپی کنید و آن را در هسته HTTP برنامه خود
بازنویسی کنید تا آن را تغییر دهید:
/** * The priority-sorted list of middleware. * * This forces non-global middleware to always be in the given order. * * @var array */protected $middlewarePriority = [ // ... \App\Http\Middleware\SetDefaultLocaleForUrls::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, // ...];