پاسخ (Response) های Http در لاراول

پاسخ (Response) های Http در لاراول

آموزش پاسخ (Response) های Http در فریم ورک لاراول از سری آموزش های سایت جاب تیم، به صورت درس به درس می باشد تا مفاهیم پایه در لاراول به شما عزیزان آموزش و سهمی کوچک از ارتقا دانش فارسی در این زمینه را ایفا کنیم. response به مفهوم پاسخ از سمت سرور برای درخواست های کلاینت می باشد. این پاسخ ها می تواند در فرمت های مختلفی مثل آرایه، رشته، آبجکت و ... باشد.

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

ایجاد پاسخ (Response) در لاراول

پاسخ به صورت رشته یا آرایه

کلیه مسیرها و کنترلرها باید پاسخی برای درخواست ها به مرورگر کاربر ارسال کنند لاراول چندین روش مختلف برای ایجاد پاسخ (response) ارائه کرده است که پاسخ به صورت رشته ای (string) یکی از اساسی ترین نوع پاسخ ها از طرف کنترلر یا مسیر (route) مورد نظر می باشد. فریم ورک لاراول به صورت خودکار پاسخ شما از نوع string را به یک پاسخ HTTP تبدیل و به مرورگر کاربر بر می گرداند.

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

علاوه بر این شاید نیاز داشته باشید که یک پاسخ به صورت آرایه را برگردانید این فریم ورک نوع آرایه را به یک پاسخ Json تبدیل کرده و بازگشت خواهد داد.

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

پاسخ به صورت آبجکت (Response Objects)

در پروژه هایی که انجام می دهید گاهی اوقات نیاز می باشد که به جای رشته یا آرایه، نوع آبجکت بعنوان پاسخ برگشت داده شود مثلا نیاز دارید که نمونه ساخته ساخته شده از کلاس Illuminate\Http\Response را برای یک view برگشت دهید و همچنین می توانید وضعیت پاسخ خود را نیز تعیین کنید وضعیت 200 ، 400  و ... که این وضعیت ها می توانند بسیار کاربردی باشند مخصوصا در api. برای روشن تر شدن موضوع می توانید مطلب api error handler رو مطالعه کنید

نمونه پاسخ از کلاس Symfony\Component\HttpFoundation\Response  ارث بری می کند ، که روشهای مختلفی را برای ساختن پاسخهای HTTP ارائه می دهد:

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

افزودن هدر به پاسخ (Attaching Headers To Responses)

بخاطر داشته باشید که بیشتر متدهای پاسخگویی (Response) می توانند به صورت زنجیره ای باشند مثلا قبل از ارسال پاسخ به کاربر می توان با متد header ، هدر های مورد نیاز را به آن افزود و سپس به کاربر پاسخ داد

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

همچنین می توانید از متد withHeader استفاده کنید و هدر های لازم را به صورت آرایه به response اضافه کنید

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

مدیریت حافظه نهان با میدل ویر (Cache Control Middleware)

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

مطالعه بیشتر : کش (حافظه پنهان یا cache) چیست؟

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

    Route::get('terms', function () {
        // ...
    });
});

افزودن کوکی به پاسخ (Attaching Cookies To Responses)

با استفاده از متد cookie می توانید کوکی خود را به response مورد نظر خود اضافه کنید به عنوان مثال ممکن است شما با متد cookie یک کوکی تولید و آن را به پاسخ خود به روش ذیل اضافه کنید.

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

شما می توانید از متد cookie با پارامتر های بیشتری نیز استفاده کنید در واقع این متد دقیقا مثل متد setcookie در php native می باشد به مثال دقت کنید می توانستیم متد cookie را با پارامترهای بیشتری به پاسخ خود اضافه کنیم.

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

همچنین می توانید از فاساد queue در کلاس Cookie برای افزودن کوکی به response استفاده کنید و به روش های ذیل می توانید این کار را انجام دهید

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

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

کوکی های رمزنگاری شده

به صورت پیش فرض تمام کوکی های تولیدی در لاراول به صورت رمزنگاری و امضا شده می باشند و نمی توان آنها را تغییر داد اما می توانید این رمزنگاری را غیرفعال کنید ولی اصلا این کار را پیشنهاد نمی کنم حالا خود لاراول این امکان رو داده ولی شما این کارو نکنید و امنیت پروژه رو پایین نیارید برای این کار فایل App\Http\Middleware\EncryptCookies را بازکنید و در قسمت except نام کوکی خود را که می خواهید رمزنگاری نشود را وارد کنید.

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

تغییر مسیر در لاراول (Redirects)

تغییر مسیر در پاسخی دهی (redirect response) از کلاس Illuminate\Http\RedirectResponse ایجاد شده است (ارث بری کرده است) و حاوی هدر های مناسب برای هدایت کاربر به URL دیگر می باشد روشهای مختلفی برای ایجاد یک RedirectResponse وجود دارد و ساده ترین روش استفاده از helper (کمک کننده) redirect می باشد:

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

بعضی اوقات ممکن است بخواهید کاربر را به آدرس قبلی خود هدایت کنید ، مانند زمانی که فرم ارسال شده نامعتبر است. برای این کار می توانید از متد کمکی helper استفاده کنید این متد از session برای تشخیص اینکه مسیر قبلی کاربر کجا بوده است استفاده می کند پس مطمئن شوید مسیری که در آن از این متد استفاده می کنید در گروه web می باشد در غیر اینصورت شما باید session را برای مسیر مورد نظر خود فعال کنید البته گفتیم برای مسیرهای web فعال می باشد پس نگران نباشید.

Route::post('user/profile', function () {
    // Validate the request...

    return back()->withInput();
});

ریدایرکت (redirect) معرفی انواع 301 و 302 و نحوه انجام

redirect به مسیرهای نام گذاری شده (Redirecting To Named Routes)

وقتی از کمک کننده redirect بدون آرگومان استفاده کنید نمونه ای از کلاس Illuminate\Routing\Redirector ساخته و بازگردانده می شود که به شما امکان می دهد تا هر متدی را در نمونه Redirector فراخونی کنید برای مثال برای تولید یک RedirectResponse به مسیری که نام گذاری شده باشد می توانید از متد route استفاد کنید:

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

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

// For a route with the following URI: profile/{id}

return redirect()->route('profile', ['id' => 1]);

Populating Parameters Via Eloquent Models

برای ارجاع به یک route با پارامتر "id" که از یک مدل Eloquent با داده پر می شود، کافی است خود مدل را به عنوان پارامتر ارسال کنید. فیلد id به صورت خودکار از مدل استخراج می شود:

// For a route with the following URI: profile/{id}

return redirect()->route('profile', [$user]);

اگر می خواهید مقداری که در پارامتر route قرار داده شده است را تغییر دهید ، باید از متد getRouteKey در مدل Eloquent مربوط عملیات override رو انجام بدید:

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

هدایت به Action کنترلر (Redirecting To Controller Actions)

گاهی نیاز می باشد تا مسیر را به یک متد در کنترلر مورد نظر خود تغییر دهید برای این کار از متد action استفاده کنید RouteServiceProvider به صورت خودکار namespace کنترلر مورد نظر شما را تشخیص می دهد

return redirect()->action('HomeController@index');

اگر action فراخوانی شده نیاز به دریافت پارامتری باشد به صورت ذیل عمل کنید

return redirect()->action(
    'UserController@profile', ['id' => 1]
);

هدایت به دامین دیگر در لاراول

برای انتقال مسیر به یک دامین خارجی (سایت دیگر) متد away را فراخوانی کنید

return redirect()->away('https://www.google.com');

redirect به همراه یک session (داده ها در session قرار دارد)

redirect کردن به یک مسیر معمولا همراه با یک session انجام می شود و معمولا پس از انجام یک عملیات موفق برای هدایت کاربر به آدرس مورد نظر بهمراه یک session با پیام موفقیت انجام می شود این کار به راحتی انجام می شود به مثال ذیل درمورد redirect همراه با session توجه کنید

Route::post('user/profile', function () {
    // Update the user's profile...

    return redirect('dashboard')->with('status', 'Profile updated!');
});

پس از هدایت کاربر به مسیر مورد نظر باید پیام ذخیره شده در session را نمایش دهید برای این کار با session که با نام status می باشد به صورت ذیل عمل کنید

@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif

انواع پاسخ های دیگر در لاراول

انواع پاسخ ها (response) در لاراول توسط helper (کمک کننده) response تولید می شود با فراخونی کمک کننده response بدون آرگومان نمونه ای از کلاس Illuminate\Contracts\Routing\ResponseFactory برگشت داده می شود که چندین روش بازگشت اطلاعات با استفاده از ResponseFactory برای شما امکان می یابد.

پاسخ (response) همراه با view

اگر نیاز به response همراه با header به یک view دارید می توانید به شکل ذیل عمل کنید

return response()
            ->view('hello', $data, 200)
            ->header('Content-Type', $type);

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

پاسخ به صورت جی سون (JSON Responses)

متد json به صورت خودکار header با مقدار application/json را به پاسخ برگشتی شما اضافه می کند همچنین با استفاده از تابع json_encode نوع دیتای برگشتی را json تبدیل می کند.

return response()->json([
    'name' => 'Abigail',
    'state' => 'CA'
]);

اگر می خواهید response خود را به شکل jsonp (پاسخ json به صورت script) بازگشت دهید از متد withCallback استفاده کنید

return response()
            ->json(['name' => 'Abigail', 'state' => 'CA'])
            ->withCallback($request->input('callback'));

دانلود فایل File Downloads در لاراول

ممکن است از متد download برای تولید پاسخی استفاده شود که مرورگر کاربر را مجبور کند فایل را در مسیر مشخص بارگیری کند. متد download ، مسیر فایل را به عنوان اولین آرگومان و نام فایل را به عنوان دومین آرگومان در این متد می پذیرد ، که نام فایل را که کاربر در حال دانلود فایل مشاهده می کند ، تعیین می کند. سرانجام ، شما ممکن است آرایه ای از هدرهای HTTP را به عنوان سومین آرگومان برای متد ارسال کنید:

return response()->download($pathToFile);

return response()->download($pathToFile, $name, $headers);

return response()->download($pathToFile)->deleteFileAfterSend();

Streamed Downloads در لاراول

گاهی اوقات نیاز داریم از روش stream download در لاراول استفاده کنیم این متد می تواند header و اسم فایل و ... را از شما برای ایجاد پاسخ برای کاربر بگیرد.

return response()->streamDownload(function () {
    echo GitHub::api('repo')
                ->contents()
                ->readme('laravel', 'laravel')['contents'];
}, 'laravel-readme.md');

File Responses پاسخ به صورت فایل

اگر می خواهید به جای دانلود یک فایل مروگر را مجبور به نمایش فایل مورد نظر کنید می توانید از متد file در پاسخ خود به صورت response استفاده کنید مثلا برای نمایش یک تصویر بدون نیاز به دانلود یا pdf می توانید از این روش استفاده کنید. متد file اولین آرگومان را بعنوان مسیر فایل و آرگومان دوم را بعنوان header دریافت می کند.

return response()->file($pathToFile);

return response()->file($pathToFile, $headers);

پاسخ با استفاده از ماکرو Response Macros

با استفاده از ماکرو می توانید یک پاسخ ایجاد کنید و دوباره از این پاسخ به صورت ماکرو (macro) در کنترلر و مسیرهای مختلف استفاده مجدد کنید  این کار را می توان با فراخوانی متد macro در پیاده سازی Illuminate\Contracts\Routing\ResponseFactory انجام داد. برای مثال می توان macro را در تابع boot که از یک service provider در اختیار را قرار می گیرد، به صورت زیر فراخوانی کرد:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * Register the application's response macros.
     *
     * @return void
     */
    public function boot()
    {
        Response::macro('caps', function ($value) {
            return Response::make(strtoupper($value));
        });
    }
}

تابع macro، یک اسم به عنوان اولین آرگومان و یک Closure به عنوان آرگومان دوم می پذیرد. Closure زمانی اجرا می شود که (اسم) macro از پیاده سازی ResponseFactory یا تابع کمکی response صدا زده شود:

return response()->caps('foo');
بهزاد میرزازاده
مسیر درست با پرسش های درست ساخته می شود

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