مفاهیم پایه لاراول 7 - URL Generation

مقدمه

این آموزش laravel برای کمک به درک بیشتر مفاهیم URL است که امیدواریم بتوانیم اطلاعات مفیدی در اختیار شما قرار بدهیم.
لاراول چندین helper برای کمک به شما در تولید URL برای برنامه فراهم می کند. این موارد اساسا هنگام ایجاد link در template ها و API response ها و یا ایجاد redirect response ها مفید هستند.

مفاهیم اولیه

تولید URL های بیسیک

 url helperبرای تولید URL های دلخواه برای برنامه استفاده می شود. URL تولید شده به صورت خودکار از (HTTP یا HTTPS) و host درخواست جاری استفاده می کند:

$post = App\Post::find(1);
    
    echo url("/posts/{$post-‌>‌id}");
    
    // http://example.com/posts/1

دسترسی به URL جاری

اگر هیچ مسیری به url helper داده نشود ، یک نمونه 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 facade به هر یک از این متد ها دسترسی داشت:

use Illuminate\Support\Facades\URL;
    
    echo URL::current();

URL برای نامگذاری Routes

route helper می تواند برای تولید URL هایی برای نامگذاری route ها استفاده شود. route های نامگذاری شده به شما امکان تولید URL ها را می دهند بدون اینکه با URL واقعی تعریف شده در route مرتبط شوید. بنابراین ، اگر URL route تغییر کند ، نیازی به تغییر در فراخوانی تابع route شما نیست. به عنوان مثال ، تصور کنید برنامه شما شامل مسیری است که مانند زیر تعریف شده است:

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

برای تولید یک URL به این route، می توانید از route helper مانند این استفاده کنید:

echo route('post.show', ['post' =‌>‌ 1]);
    
    // http://example.com/post/1

معمولاً URL هایی با استفاده از primary key مدل های Eloquent تولید می کنید. به همین دلیل ، ممکن است Eloquent model ها را به عنوان مقادیر پارامتر منتقل کنید. route helperبه صورت اتومات primary key مدل را استخراج می کند:

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

route helper ممکن است برای تولید URL هایی استفاده شود که  route هایی با چندین پارامتر دارند:

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 های Sign شده

لاراول به شما اجازه می دهد تا به راحتی URL های "signed" را برای named route ها ایجاد کنید. این URL ها دارای یک "sign" هستند که به query string اضافه شده است که به لاراول اجازه می دهد تا بررسی کند URL از زمان ایجاد اصلاح نشده است. URL های sign شده به ویژه برای route هایی که به صورت public در دسترس قرار دارند بسیار مفید هستند. اما به یک لایه protection در برابر دستکاری URL نیاز دارند.

به عنوان مثال ، شما ممکن است از URL های sign شده برای انجام  "unsubscribe" استفاده کنید که برای مشتریان شما از طریق ایمیل ارسال می شود. برای ایجاد یک URL sign شده به named route، از متد signedRoute  مربوط به URL facade استفاده کنید:

use Illuminate\Support\Facades\URL;
    
    return URL::signedRoute('unsubscribe', ['user' =‌>‌ 1]);

اگر می خواهید یک signed route URL ایجاد کنید که منقضی شود ، می توانید از متد temporarySignedRoute استفاده کنید:

use Illuminate\Support\Facades\URL;
    
    return URL::temporarySignedRoute(
        'unsubscribe', now()-‌>‌addMinutes(30), ['user' =‌>‌ 1]
    );

Validating Signed Route Requests

برای تأیید اینکه یک درخواست ورودی valid signature دارد ، باید متد hasValidSignature در incoming Request فراخوانی کنید:

use Illuminate\Http\Request;
    
    Route::get('/unsubscribe/{user}', function (Request $request) {
        if (! $request-‌>‌hasValidSignature()) {
            abort(401);
        }
    
        // ...
    })-‌>‌name('unsubscribe');

همچنین می توانید میان افزار Illuminate\Routing\Middleware\ValidateSignature را به route اختصاص دهید. اگر از قبل موجود نیست ، باید اینmiddleware key را در آرایهHTTP kernel 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 را در کرنل رجیسترکردید ، می توانید آن را به یک route اتچ کنید. اگر درخواست ورودی valid signature نداشته باشد ، middleware به طور خودکار پاسخ خطای 403 را برمی گرداند:

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

URL هایی برایController Action ها  

تابع action یک URL برای  controller action ایجاد می کند. نیازی به ارسال نام کامل  controller نیست. در عوض ، نام کلاس  controller را نسبت به فضای نام App\Http\Controllers منتقل کنید:

$url = action('[email protected]');

همچنین می توانید به action هایی با syntax آرایه "callable" مراجعه کنید:

use App\Http\Controllers\HomeController;
    
    $url = action([HomeController::class, 'index']);

اگر متد controller پارامترهای route را بپذیرد ، می توانید آنها را به عنوان آرگومان دوم به تابع منتقل کنید:

$url = action('[email protected]', ['id' =‌>‌ 1]);

مقادیر پیش فرض

برای برخی از برنامه ها ، ممکن است بخواهید default value درخواست را برای پارامترهای خاص URL تعیین کنید. به عنوان مثال ، تصور کنید بسیاری از route های شما پارامتر {locale} را تعریف می کنند:

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

هر زمان که route helper را فراخوانی می کنید ، باید locale را ارسال کنید ، سخت است. بنابراین ، شما می توانید از متد URL::defaults برای تعیین default value برای این پارامتر استفاده کنید که همیشه هنگام request جاری اعمال می شود. ممکن است بخواهید این متد را از route 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 helper مقدار آن را ارسال کنید.

امیدواریم این آموزش از مقالات آموزش لاراول برایتان مفید بوده باشد.