نسخه:

تولید 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 ارسال کنید.