پاسخ های HTTP
ایجاد پاسخ
رشته ها و آرایه ها
همه مسیرها و کنترلرها باید پاسخی را برگردانند تا به مرورگر کاربر ارسال شود. لاراول چندین راه مختلف برای بازگرداندن پاسخ ها ارائه می دهد. ابتدایی ترین پاسخ، برگرداندن یک رشته از یک مسیر یا کنترلر است. چارچوب به طور خودکار رشته را به یک پاسخ HTTP کامل تبدیل می کند:
Route::get('/', function () { return 'Hello World';});
علاوه بر برگرداندن رشته ها از مسیرها و کنترلرهای خود، ممکن است آرایه ها را نیز برگردانید. چارچوب به طور خودکار آرایه را به یک پاسخ JSON تبدیل می کند:
Route::get('/', function () { return [1, 2, 3];});
آیا میدانستید که میتوانید مجموعههای Eloquent را از مسیرها یا کنترلرهای خود بازگردانید؟ آنها به طور خودکار به JSON تبدیل می شوند. امتحان کن!
اشیاء پاسخ
به طور معمول، شما فقط رشته ها یا آرایه های ساده را از اقدامات مسیر خود بر
نمی گردانید.
Illuminate\Http\Response
در عوض، نمونهها یا
نماهای
کامل را برمیگردانید
.
بازگرداندن یک
Response
نمونه کامل به شما امکان میدهد کد و سرصفحه وضعیت HTTP پاسخ را سفارشی
کنید.
یک
Response
نمونه از
Symfony\Component\HttpFoundation\Response
کلاس به ارث میبرد که روشهای مختلفی را برای ساخت پاسخهای HTTP ارائه
میکند:
Route::get('home', function () { return response('Hello World', 200) ->header('Content-Type', 'text/plain');});
پیوست کردن سرصفحه ها به پاسخ ها
به خاطر داشته باشید که اکثر روشهای پاسخ زنجیرهای هستند و امکان ساخت
روان نمونههای پاسخ را فراهم میکنند.
برای مثال، میتوانید از
header
روشی برای اضافه کردن یک سری سرصفحه به پاسخ قبل از ارسال آن به کاربر
استفاده کنید:
return response($content) ->header('Content-Type', $type) ->header('X-Header-One', 'Header Value') ->header('X-Header-Two', 'Header Value');
یا، می توانید از
withHeaders
روش برای تعیین آرایه ای از هدرها برای افزودن به پاسخ استفاده کنید:
return response($content) ->withHeaders([ 'Content-Type' => $type, 'X-Header-One' => 'Header Value', 'X-Header-Two' => 'Header Value', ]);
میان افزار کنترل کش
لاراول شامل یک
cache.headers
میان افزار است که ممکن است برای تنظیم سریع
Cache-Control
هدر برای گروهی از مسیرها استفاده شود.
اگر
etag
در لیست دستورالعمل ها مشخص شده باشد، یک هش MD5 از محتوای پاسخ به طور
خودکار به عنوان شناسه ETag تنظیم می شود:
Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () { Route::get('privacy', function () { // ... }); Route::get('terms', function () { // ... });});
پیوست کردن کوکی ها به پاسخ ها
روش
cookie
مربوط به نمونه های پاسخ به شما امکان می دهد به راحتی کوکی ها را به پاسخ
متصل کنید.
برای مثال، میتوانید از این
cookie
روش برای تولید یک کوکی استفاده کنید و آن را به صورت روان به نمونه پاسخ
وصل کنید:
return response($content) ->header('Content-Type', $type) ->cookie('name', 'value', $minutes);
این
cookie
روش همچنین چند آرگومان بیشتر را می پذیرد که کمتر مورد استفاده قرار می
گیرند.
به طور کلی، این آرگومان ها همان هدف و معنای آرگومان هایی را دارند که به
متد
setcookie
بومی PHP داده می شود :
->cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
از طرف دیگر، میتوانید از
Cookie
نما برای «صف» کردن کوکیها برای پیوست کردن به پاسخ خروجی از برنامهتان
استفاده کنید.
متد
queue
یک
Cookie
نمونه یا آرگومان های مورد نیاز برای ایجاد یک
Cookie
نمونه را می پذیرد.
این کوکیها قبل از ارسال به مرورگر به پاسخ خروجی پیوست میشوند:
Cookie::queue(Cookie::make('name', 'value', $minutes)); Cookie::queue('name', 'value', $minutes);
کوکی ها و رمزگذاری
بهطور پیشفرض، تمام کوکیهای تولید شده توسط لاراول رمزگذاری شده و امضا
میشوند تا امکان تغییر یا خواندن توسط کلاینت وجود نداشته باشد.
اگر میخواهید رمزگذاری را برای زیرمجموعهای از کوکیهای تولید شده توسط
برنامهتان غیرفعال کنید، میتوانید از
$except
ویژگی
App\Http\Middleware\EncryptCookies
میانافزار که در فهرست قرار دارد استفاده کنید
app/Http/Middleware
:
/** * The names of the cookies that should not be encrypted. * * @var array */protected $except = [ 'cookie_name',];
تغییر مسیرها
پاسخهای تغییر مسیر نمونههایی از
Illuminate\Http\RedirectResponse
کلاس هستند و حاوی سرصفحههای مناسبی هستند که برای هدایت کاربر به URL دیگر
لازم است.
چندین روش برای تولید یک نمونه وجود دارد
RedirectResponse
.
ساده ترین روش استفاده از
redirect
کمک کننده جهانی است:
Route::get('dashboard', function () { return redirect('home/dashboard');});
گاهی اوقات ممکن است بخواهید کاربر را به مکان قبلی خود هدایت کنید، مانند
زمانی که فرم ارسال شده نامعتبر است.
می توانید این کار را با استفاده از
back
تابع کمکی جهانی انجام دهید.
از آنجایی که این ویژگی از
session
استفاده میکند ، مطمئن شوید که مسیر فراخوانی تابع از گروه میانافزار
back
استفاده میکند
web
یا تمام میانافزار جلسه اعمال شده است:
Route::post('user/profile', function () { // Validate the request... return back()->withInput();});
تغییر مسیر به مسیرهای نامگذاری شده
وقتی
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]);
پر کردن پارامترها از طریق مدل های Eloquent
اگر به مسیری با پارامتر "ID" هدایت میشوید که از یک مدل Eloquent پر شده است، میتوانید خود مدل را پاس کنید. شناسه به طور خودکار استخراج می شود:
// For a route with the following URI: profile/{id} return redirect()->route('profile', [$user]);
اگر می خواهید مقداری را که در پارامتر route قرار می گیرد سفارشی کنید، می
توانید ستون را در تعریف پارامتر مسیر (
profile/{id:slug}
) مشخص کنید یا می توانید
getRouteKey
روش را در مدل Eloquent خود لغو کنید:
/** * Get the value of the model's route key. * * @return mixed */public function getRouteKey(){ return $this->slug;}
تغییر مسیر به اقدامات کنترلر
همچنین میتوانید تغییر مسیرهایی را به
اقدامات کنترلر
ایجاد کنید .
برای انجام این کار، نام کنترلر و عمل را به
action
متد ارسال کنید.
به یاد داشته باشید، لازم نیست فضای نام کامل را برای کنترلر مشخص کنید،
زیرا Laravel
RouteServiceProvider
به طور خودکار فضای نام کنترل کننده پایه را تنظیم می کند:
return redirect()->action('HomeController@index');
اگر مسیر کنترلر شما به پارامترهایی نیاز دارد، می توانید آنها را به عنوان
آرگومان دوم به
action
متد ارسال کنید:
return redirect()->action( 'UserController@profile', ['id' => 1]);
تغییر مسیر به دامنه های خارجی
گاهی اوقات ممکن است لازم باشد به دامنه ای خارج از برنامه خود تغییر مسیر
دهید.
می توانید این کار را با فراخوانی
away
متد انجام دهید، که
RedirectResponse
بدون کدگذاری URL اضافی، اعتبارسنجی یا تأیید ایجاد می کند:
return redirect()->away('https://www.google.com');
تغییر مسیر با داده های جلسه فلش شده
تغییر مسیر به یک URL جدید و
فلش کردن داده ها به جلسه
معمولاً همزمان انجام می شود.
به طور معمول، این کار پس از انجام موفقیت آمیز یک عمل انجام می شود، زمانی
که یک پیام موفقیت آمیز را به جلسه فلش می کنید.
برای راحتی، میتوانید یک
RedirectResponse
نمونه ایجاد کنید و دادهها را در یک زنجیره روش روان و روان در جلسه ایجاد
کنید:
Route::post('user/profile', function () { // Update the user's profile... return redirect('dashboard')->with('status', 'Profile updated!');});
پس از هدایت کاربر، می توانید پیام فلش شده از جلسه را نمایش دهید . به عنوان مثال، با استفاده از دستور Blade :
@if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div>@endif
انواع دیگر پاسخ
کمک
response
کننده ممکن است برای تولید انواع دیگری از نمونه های پاسخ استفاده شود.
هنگامی که
response
کمک کننده بدون استدلال فراخوانی می شود، اجرای قرارداد
Illuminate\Contracts\Routing\ResponseFactory
برگردانده
می شود.
این قرارداد چندین روش مفید برای ایجاد پاسخ ارائه می دهد.
مشاهده پاسخ ها
اگر به کنترل وضعیت پاسخ و هدرها نیاز دارید، اما همچنین نیاز به برگرداندن
یک
نمای
به عنوان محتوای پاسخ دارید، باید از
view
روش زیر استفاده کنید:
return response() ->view('hello', $data, 200) ->header('Content-Type', $type);
البته، اگر نیازی به ارسال کد وضعیت سفارشی HTTP یا هدرهای سفارشی ندارید،
باید از
view
تابع راهنمای جهانی استفاده کنید.
پاسخ های JSON
این
json
متد به طور خودکار
Content-Type
هدر را روی تنظیم می کند
application/json
و همچنین آرایه داده شده را با استفاده از
json_encode
تابع PHP به JSON تبدیل می کند:
return response()->json([ 'name' => 'Abigail', 'state' => 'CA',]);
اگر می خواهید یک پاسخ JSONP ایجاد کنید، می توانید از این
json
روش در ترکیب با
withCallback
روش استفاده کنید:
return response() ->json(['name' => 'Abigail', 'state' => 'CA']) ->withCallback($request->input('callback'));
دانلود فایل
این
download
روش ممکن است برای ایجاد پاسخی استفاده شود که مرورگر کاربر را مجبور به
دانلود فایل در مسیر داده شده کند.
این
download
روش یک نام فایل را به عنوان آرگومان دوم متد می پذیرد، که نام فایلی را که
توسط کاربر دانلود کننده فایل مشاهده می شود، تعیین می کند.
در نهایت، می توانید آرایه ای از هدرهای HTTP را به عنوان آرگومان سوم به
متد ارسال کنید:
return response()->download($pathToFile); return response()->download($pathToFile, $name, $headers); return response()->download($pathToFile)->deleteFileAfterSend();
Symfony HttpFoundation، که دانلود فایل ها را مدیریت می کند، نیاز دارد که فایل در حال دانلود دارای نام فایل ASCII باشد.
دانلودهای جریانی
گاهی اوقات ممکن است بخواهید پاسخ رشته ای یک عملیات معین را بدون نیاز به
نوشتن محتویات عملیات روی دیسک به یک پاسخ قابل دانلود تبدیل کنید.
در این سناریو می توانید از
streamDownload
روش استفاده کنید.
این متد یک فراخوان، نام فایل و یک آرایه اختیاری از هدرها را به عنوان
آرگومان های خود می پذیرد:
return response()->streamDownload(function () { echo GitHub::api('repo') ->contents() ->readme('laravel', 'laravel')['contents'];}, 'laravel-readme.md');
پاسخ های فایل
این
file
روش ممکن است برای نمایش یک فایل، مانند یک تصویر یا PDF، بهجای شروع
دانلود، مستقیماً در مرورگر کاربر استفاده شود.
این متد مسیر فایل را به عنوان اولین آرگومان و آرایه ای از هدرها را به
عنوان آرگومان دوم می پذیرد:
return response()->file($pathToFile); return response()->file($pathToFile, $headers);
ماکروهای پاسخگویی
اگر می خواهید یک پاسخ سفارشی تعریف کنید که بتوانید مجدداً در مسیرهای
مختلف و کنترلرهای خود از آن استفاده کنید، می توانید از این
macro
روش در
Response
نما استفاده کنید.
به عنوان مثال، از روش
ارائه دهنده خدمات
boot
:
<?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 را به عنوان دومین
آرگومان خود می پذیرد.
هنگام فراخوانی نام ماکرو از یک
ResponseFactory
پیاده سازی یا
response
کمک کننده، بسته شدن ماکرو اجرا می شود:
return response()->caps('foo');