تولید url در لاراول (url generation in laravel)

تولید url در لاراول  (url generation in laravel)

فریم ورک لاراول چندین کمک کننده (helper) برای تولید url در لاراول ارائه می کند url ها عمدتا در قالب پروژه و برای پاسخ دهی به api یا هنگام تغییر مسیر (redirect) مورد استفاده قرار می گیرند با استفاده از این کمک کننده ها شما می توانید با چندین روش مختلف برای مسیر خود url تولید کنید.

زمان مطالعه: 3 دقیقه
بازدید: 1685
پرسش و پاسخ: 2

مباحث اولیه در تولید url در فریم ورک لاراول 

تولید url ساده در لاراول

تولید url ساده در لاراول با کمک کننده url می تواند انجام شود شما می توانید url های دلخواه خود را ایجاد کنید. این تابع خود نوع http یا https بودن سایت شما را تشخیص و هندل می کند به مثال توجه کنید:

$post = App\Post::find(1);

echo url("/posts/{$post->id}");

// http://example.com/posts/1

همانطور که مشاهده می کنید اگر آدرس سایت شما example.com باشد با دستور بالا آدرس http://example.com/posts/1 تولید می شود.

آموزش لاراول دوره جامع پروژه محور ساخت فروشگاه اینترنتی

دسترسی به url فعلی در لاراول

دسترسی به url فعلی در لاراول به روشی که توضیح می دهیم امکان پذیر می باشد اگر شما هیچ مسیری با استفاده از کمک کننده url مشخص نکنید یک نمونه از کلاس Illuminate\Routing\UrlGenerator برای شما برگشت داده می شود و به شما امکان دسترسی به اطلاعات مسیر فعلی را می دهد. به نمونه های ذیل توجه کنید:

// 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 برای مسیرهای نامگذاری شده لاراول (URLs For Named Routes)

تولید url برای مسیرهای نامگذاری شده با کمک کننده route می تواند انجام شود مسیرهای نامگذاری شده در لاراول به شما امکان می دهند تا به راحتی با استفاده از name مشخص شده برای url، به آن دسترسی داشته باشید یکی از مزیت های استفاده کمک کننده route این می باشد که در صورت تغییر مسیر و ثابت بودن name مسیر مورد نظر، دیگر نیازی به تغییر در مسیرهای انتصاب شده را ندارید به مثال ذیل توجه کنید:

Route::get('/post/{post}', function () {
    //
})->name('post.show');

برای تولید url برای این مسیر می توانید به صورت ذیل عمل کنید تا مسیر http://example.com/post/1 تولید شود:

echo route('post.show', ['post' => 1]);

// http://example.com/post/1

اغلب در پروژه ها پارامتر ورودی url ها شناسه ای از مدل می باشد به همین علت ممکن است شما یک مدل را بعنوان پارامتر ورودی مسیر خود انتخاب کنید کمک کننده 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 های امضا (کد) شده لاراول (Signed URLs)

لاراول به شما امکان ایجاد آدرس (url) های هش شده (امضا شده ) برای مسیرهای نامگذاری شده را می دهد این url ها دارای یک رشته هش شده هستند که به لاراول امکان می دهد تا url تولید شده را چک کند که آیا کاربر تغییر داده یا نه؟ و همچنین زمان تولید و ... نیز می تواند چک شود این نوع آدرسهای تولید شده مخصوصا برای ایجاد دسترسی دانلود برای کاربرانی که یک محصول قابل دانلود را خریده اند بسیار مفید است ما قبلا یک مثال کامل در مورد ایجاد اینگونه آدرس ها برای دانلود فایل با عنوان ساخت url های موقت در لاراول temporary Signed Route در سایت جاب تیم قرار داده شده است.

برای مثال امکان دارد شما از 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]
);

اعتبار سنجی مسیرهای امضا شده (Validating Signed Route Requests)

برای اعتبارسنجی مسیر های امضا شده می توانید از متد hasValidSignature در کلاس Request استفاده کنید روش اعتبارسنجی به شکل ذیل خواهد بود:

use Illuminate\Http\Request;

Route::get('/unsubscribe/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        abort(401);
    }

    // ...
})->name('unsubscribe');

همچنین می توانید میدل ویر Illuminate\Routing\Middleware\ValidateSignature را مستقیما به مسیر خود اعمال کنید تا عملیات اعتبارسنجی خودکار انجام شود اگر این میدل ویر را ندارید می توانید در فایل kernel.php در قسمت routeMiddleware آن را اضافه کنید

/**
 * 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,
];

هنگامی که این middleware را در فایل kernel.php اضافه کردید می توانید آن را به مسیر خود اضافه کنید اگر درخواستی به این مسیر امضا شده معتبر نباشد خطای 403 برگشت داده خواهد شد.

Route::post('/unsubscribe/{user}', function (Request $request) {
    // ...
})->name('unsubscribe')->middleware('signed');

url برای action های کنترلر

تابع action به شما کمک می کند تا یک url برای دسترسی به یک متد کنترلر مورد نظر خود ایجاد کنید در این روش نیازی به معرفی آدرس کامل کنترلر نیست فقط کافیست نام کنترلر و سپس متد خود را معرفی کنید:

$url = action('HomeController@index');

همچنین می توانید به روش ذیل نیز به متد خود در کنترلر با متد action دسترسی داشته باشید:

use App\Http\Controllers\HomeController;

$url = action([HomeController::class, 'index']);

اگر متد مورد نظر شما دارای پارامتر ورودی باشد می توانید پارامتر را به عنوان آرگومان دوم مقداردهی کنید:

$url = action('UserController@profile', ['id' => 1]);

مقادیر پیش فرض (default) در ایجاد url

در برخی از پروژه ها ممکن است مقادیری به عنوان آرگومان url در تمام مسیرها باشد بعنوان مثال شاید برخی از مسیرهای پارامتر ورودی {locale} را داشته باشند به مثال ذیل دقت کنید:

Route::get('/{locale}/posts', function () {
    //
})->name('post.index');

تعیین مقادیر پیش فرض برای هر کدام از مسیرها در صورتی که قرار باشد تمام مسیرها این مقدار پیش فرض را داشته باشند کاری دشوار خواهد بود نگران نباشید می توانید از متد URL::defaults استفاده کنید تا همیشه برای مسیر درخواستی تعیین شده پارامتر پیش فرض شما را اضافه کند شما می توانید این کار را با استفاده از یک middleware انجام دهید و به راحتی به با اعمال سراسری یا گروهی 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);
    }
}

پس از این کار دیگر نیازی به تعریف مقادیر پیش فرض خود برای تک تک مسیرها نخواهد بود.

مطالعه بیشتر : فریمورک چیست؟

بهزاد میرزازاده
مسیر درست با پرسش های درست ساخته می شود

مشاهده تمام مطالب نویسنده