لاراول چند تابع کمکی (helper) برای تولید URLها در برنامه در اختیار ما قرار داده است. البته، استفاده از این توابع عمدتا در زمان ایجاد لینکها در قالبهای HTML و پاسخهای API، یا در زمان ایجاد پاسخهای redirect شده به قسمتهای دیگر برنامه، مفید خواهد بود.
ایجاد URLهای اصلی
Generating Basic URLs
helper یا تابع کمکی 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();
همچنین، هر یک از این متدها میتواند از طریق fasade URL نیز قابل دسترسی باشد:
echo URL::current();
URLهای مسیرهای نامگذاری شده
برای تولید URL به مسیرهای نامگذاری شده، میتوان از تابع کمکی route استفاده کرد. مسیرهای نامگذاری شده به شما امکان میدهد که 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]);
تولید URLها برای اکشنهای کنترلر
از تابع action میتوان جهت تولید URL برای یک اکشن کنترلر استفاده کرد. در این صورت، لازم نیست فضای نامی کامل کنترلر را انتقال داد. به جای آن، می توان نام کلاس کنترلر را نسبت به فضای نامی App\Http\Controllers انتقال داد:
$url = action('[email protected]');
اگر متد کنترلر پارامترهای مسیر را میپذیرد، میتوانید آنها را به عنوان آرگومان دوم به این تابع انتقال دهید:
$url = action('[email protected]', ['id' => 1]);
انتقال مقادیر پیشفرض به URL
برای برخی از برنامهها، ممکن است بخواهید مقادیر پیشفرض درخواستی را برای پارامترهای خاص URL تعیین کنید. برای مثال، فرض کنید بسیاری از مسیرها دارای یک پارامتر {locale} باشند:
Route::get('/{locale}/posts', function () {
//
})->name('post.index');
زمانی که تابع کمکی route را فراخوانی میکنید، انتقال locale ممکن است کمی کار را دشوار کند. بنابراین، میتوانید از متد URL::defaults برای تعریف یک مقدار پیشفرض برای این پارامتر که همیشه در طول درخواست فعلی اعمال میشود، استفاده کنید. میتوانید این متد را از middleware مسیر فراخوانی کنید تا بتوانید به درخواست فعلی دسترسی داشته باشید:
<?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 نیست.
https://www.lydaweb.com/article/courses/laravel-5-5-tutorial/255/تولید-url-لاراول-5-5