آموزش لاراول 7: آموزش HTTP Responses در لاراول

ایجاد Responses

رشته ها و آرایه ها

رسیدیم به این بخش از آموزش لاراول که در خصوص HTTP response است و میخواهیم به تفصیل آن را بررسی کنیم. همه route ها و controller ها باید پاسخی را برای ارسال به مرورگر کاربر برگردانند. لاراول چندین روش مختلف برای ارسال response ارائه می دهد. اساسی ترین response، بازگرداندن رشته ای از route یا controller است. این فریم ورک رشته را به طور خودکار به یک HTTP response کامل تبدیل می کند:

Route::get('/', function () {
        return 'Hello World';
    });

علاوه بر بازگشت رشته ها از route ها و controller ها ، میتوانید آرایه ها را نیز برگردانید. فریم ورک به طور خودکار آرایه را به یک JSON response تبدیل می کند:

Route::get('/', function () {
        return [1, 2, 3];
    });

Response Objects

به طور معمول ، شما فقط رشته ها یا آرایه های ساده را از route خود بر نمی گردانید. instance ها یا view های کامل Illuminate\Http\Response را برمی گردانید.

بازگشت یک نمونه Response کامل به شما امکان می دهد کد وضعیت و هدر های response's HTTP را سفارشی کنید. یک Response از کلاس Symfony\Component\HttpFoundation\Response ارث بری می کند، که انواع مختلفی از متدها را برای ساخت HTTP response فراهم می کند:

Route::get('home', function () {
        return response('Hello World', 200)
                      -‌>‌header('Content-Type', 'text/plain');
    });

پیوست Headers به  Responses

بخاطر داشته باشید که بیشتر متدهای response قابل تنظیم هستند و امکان ساخت response instance ها را فراهم می کنند. به عنوان مثال ، می توانید از متد header برای اضافه کردن یک سری هدر به response قبل از ارسال به کاربر استفاده کنید:

return response($content)
                -‌>‌header('Content-Type', $type)
                -‌>‌header('X-Header-One', 'Header Value')
                -‌>‌header('X-Header-Two', 'Header Value');

یا ، می توانید از متد withHeaders برای تعیین آرایه ای از header ها برای افزودن به response استفاده کنید:

return response($content)
                -‌>‌withHeaders([
                    'Content-Type' =‌>‌ $type,
                    'X-Header-One' =‌>‌ 'Header Value',
                    'X-Header-Two' =‌>‌ 'Header Value',
                ]);
Cache Control Middleware

لاراول شامل یک cache.headers middleware است که می تواند برای تنظیم هدر Cache-Control گروهی از route ها استفاده شود. اگر etag در لیست دستور ها مشخص شده باشد ، یک MD5 hash از محتوای response به طور خودکار به عنوان شناسه ETag تنظیم می شود:

Route::middleware('cache.headers:public;max_age=2628000;etag')-‌>‌group(function () {
        Route::get('privacy', function () {
            // ...
        });
    
        Route::get('terms', function () {
            // ...
        });
    });

پیوست Cookies به Responses

متد cookie در response instance ها به شما امکان می دهد کوکی ها را به راحتی به response ضمیمه کنید. به عنوان مثال ، شما می توانید از متد cookie برای تولید یک کوکی استفاده کنید و به راحتی آن را به response instance اتچ کنید:

return response($content)
                    -‌>‌header('Content-Type', $type)
                    -‌>‌cookie('name', 'value', $minutes);

متد cookie چندآرگومان دیگر نیز می پذیرد که کمتر استفاده می شود. به طور کلی ، این آرگومان ها همان هدف مشابه آرگومان هاییکه به متد PHP's native setcookie داده می شوند را دارند:

-‌>‌cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)

شما می توانید از Cookie facade برای"queue" کوکی ها جهت پیوست به response خروجی از برنامه خود استفاده کنید. متد queue یک Cookie instance یا آرگومان های مورد نیاز برای ایجاد Cookie instance را می پذیرد. این کوکی ها قبل از ارسال به مرورگر به outgoing response پیوست می شوند:

Cookie::queue(Cookie::make('name', 'value', $minutes));
    
    Cookie::queue('name', 'value', $minutes);

Cookies و  Encryption

به طور پیش فرض ، تمام کوکی های تولید شده توسط laravel رمزگذاری شده و امضا شده اند تا توسط client قابل تغییر یا خواندن نباشند. اگر می خواهید رمزگذاری برای زیرمجموعه کوکی های تولید شده توسط برنامه خود را غیرفعال کنید ، می توانید از ویژگی $except از App\Http\Middleware\EncryptCookies middleware استفاده کنید که در دایرکتوری app/Http/Middleware قرار دارد.

/**
     * The names of the cookies that should not be encrypted.
     *
     * @var array
     */
    protected $except = [
        'cookie_name',
    ];

Redirects

Redirect response ها نمونه هایی از کلاس Illuminate\Http\RedirectResponse هستند و حاوی header های مناسب مورد نیاز برای هدایت کاربر به URL دیگر هستند. متدهای مختلفی برای تولید RedirectResponse instance وجود دارد. ساده ترین متد استفاده از global redirect helper است:

Route::get('dashboard', function () {
        return redirect('home/dashboard');
    });

بعضی اوقات ممکن است بخواهید کاربر را به مکان قبلی redirect کنید، مثلاً وقتی فرم ارسالی نامعتبر است. این کار را می توانید با استفاده از تابع global back helper انجام دهید. از آنجا که این ویژگی از session استفاده می کند ، اطمینان حاصل کنید که روتی که تابع back را فراخوانی می کند از web middleware group استفاده می کند یا تمام session middleware را اعمال کرده است:

Route::post('user/profile', function () {
        // Validate the request...
    
        return back()-‌>‌withInput();
    });

Redirecting به Route های نامگذاری شده

هنگامی که redirect helper بدون پارامتر فراخوانی می کنید، نمونه ای از Illuminate\Routing\Redirector بازگردانده می شود. به شما این امکان را می دهد که هر متدی را در Redirector instance فراخوانی کنید. به عنوان مثال ، برای ایجاد RedirectResponse به یک route مشخص ، می توانید از متد route استفاده کنید:

return redirect()-‌>‌route('login');

اگر route شما دارای پارامترهایی باشد ، می توانید آنها را به عنوان آرگومان دوم به متد route ارسال کنید:

// For a route with the following URI: profile/{id}
    
    return redirect()-‌>‌route('profile', ['id' =‌>‌ 1]);

پارامترهای Populating با مدل های Eloquent 

اگر می خواهید روتی با پارامتر "ID" از Eloquent model را redirect کنید ،می توانید خود مدل را ارسال  کنید. ID به طور خودکار استخراج می شود:

// For a route with the following URI: profile/{id}
    
    return redirect()-‌>‌route('profile', [$user]);

چنانچه می خواهید مقداری را که در پارامتر route قرار می گیرد سفارشی کنید ، می توانید ستونی را در تعریف پارامتر route مشخص کنید (profile/{id:slug}) یا می توانید متد getRouteKey را در مدل Eloquent خود override کنید:

/**
     * Get the value of the model's route key.
     *
     * @return mixed
     */
    public function getRouteKey()
    {
        return $this-‌>‌slug;
    }

Redirecting به کنترلر Action ها

شما همچنین می توانید برای controller action ها نیز redirect هایی ایجاد کنید. برای این کار ، controller و action name را به متد action ارسال کنید. نیازی نیست که namespace کامل را برای controller مشخص کنید زیرا RouteServiceProvider به طور خودکار namespace کنترلر را تنظیم می کند:

return redirect()-‌>‌action('[email protected]');

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

return redirect()-‌>‌action(
        '[email protected]', ['id' =‌>‌ 1]
    );

ادامه دارد...

× در حال پاسخ به: