پاسخ های 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');});
مدل ها و مجموعه های الکوئنت
همچنین میتوانید مدلها و مجموعههای Eloquent ORM را مستقیماً از مسیرها و کنترلکنندههای خود بازگردانید. وقتی این کار را انجام می دهید، لاراول به طور خودکار مدل ها و مجموعه ها را به پاسخ های JSON تبدیل می کند و در عین حال به ویژگی های پنهان مدل احترام می گذارد :
use App\Models\User; Route::get('/user/{user}', function (User $user) { return $user;});
پیوست کردن سرصفحه ها به پاسخ ها
به خاطر داشته باشید که اکثر روشهای پاسخ زنجیرهای هستند و امکان ساخت روان نمونههای پاسخ را فراهم میکنند. برای مثال، میتوانید از
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 () { // ... });});
پیوست کردن کوکی ها به پاسخ ها
Illuminate\Http\Response
با استفاده از این روش
میتوانید یک کوکی را به یک نمونه خروجی پیوست کنید
cookie
. شما باید نام، مقدار و تعداد دقیقه های کوکی را به این روش ارسال کنید:
return response('Hello World')->cookie( 'name', 'value', $minutes);
این
cookie
روش همچنین چند آرگومان بیشتر را می پذیرد که کمتر مورد استفاده قرار می گیرند. به طور کلی، این آرگومان ها همان هدف و معنای آرگومان هایی را دارند که به
متد
setcookie
بومی PHP داده می شود :
return response('Hello World')->cookie( 'name', 'value', $minutes, $path, $domain, $secure, $httpOnly);
اگر میخواهید مطمئن شوید که یک کوکی همراه با پاسخ خروجی ارسال میشود، اما هنوز نمونهای از آن پاسخ را ندارید، میتوانید از نما
Cookie
برای «صفبندی» کوکیها برای پیوست به پاسخ هنگام ارسال آن استفاده کنید. این
queue
روش آرگومان های مورد نیاز برای ایجاد یک نمونه کوکی را می پذیرد. این کوکیها قبل از ارسال به مرورگر به پاسخ خروجی پیوست میشوند:
use Illuminate\Support\Facades\Cookie; Cookie::queue('name', 'value', $minutes);
ایجاد نمونه های کوکی
اگر میخواهید نمونهای ایجاد کنید
Symfony\Component\HttpFoundation\Cookie
که بتواند در زمان دیگری به یک نمونه پاسخ متصل شود، میتوانید از
cookie
راهنمای جهانی استفاده کنید. این کوکی به مشتری ارسال نمی شود مگر اینکه به یک نمونه پاسخ پیوست شده باشد:
$cookie = cookie('name', 'value', $minutes); return response('Hello World')->cookie($cookie);
کوکیها زود انقضا میشوند
میتوانید یک کوکی را با منقضی کردن آن از طریق
withoutCookie
روش پاسخ خروجی حذف کنید:
return response('Hello World')->withoutCookie('name');
اگر هنوز نمونه ای از پاسخ خروجی ندارید، می توانید از روش
Cookie
نما
expire
برای منقضی کردن یک کوکی استفاده کنید:
Cookie::expire('name');
کوکی ها و رمزگذاری
بهطور پیشفرض، به لطف
Illuminate\Cookie\Middleware\EncryptCookies
میانافزار، تمام کوکیهای تولید شده توسط لاراول رمزگذاری شده و امضا میشوند تا امکان تغییر یا خواندن توسط کلاینت وجود نداشته باشد. اگر میخواهید رمزگذاری زیرمجموعهای از کوکیهای تولید شده توسط برنامه شما را غیرفعال کنید، میتوانید از
encryptCookies
روش موجود در فایل برنامه خود استفاده کنید
bootstrap/app.php
:
->withMiddleware(function (Middleware $middleware) { $middleware->encryptCookies(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. */public function getRouteKey(): mixed{ return $this->slug;}
تغییر مسیر به اقدامات کنترلر
همچنین میتوانید تغییر مسیرهایی را به
اقدامات کنترلر
ایجاد کنید . برای انجام این کار، نام کنترلر و عمل را به
action
متد ارسال کنید:
use App\Http\Controllers\UserController; return redirect()->action([UserController::class, 'index']);
اگر مسیر کنترلر شما به پارامترهایی نیاز دارد، می توانید آنها را به عنوان آرگومان دوم به
action
متد ارسال کنید:
return redirect()->action( [UserController::class, 'profile'], ['id' => 1]);
تغییر مسیر به دامنه های خارجی
گاهی اوقات ممکن است لازم باشد به دامنه ای خارج از برنامه خود تغییر مسیر دهید. می توانید این کار را با فراخوانی
away
متد انجام دهید، که
RedirectResponse
بدون کدگذاری URL اضافی، اعتبارسنجی یا تأیید ایجاد می کند:
return redirect()->away('https://www.google.com');
تغییر مسیر با داده های جلسه فلش شده
تغییر مسیر به یک URL جدید و
فلش کردن داده ها به جلسه
معمولاً همزمان انجام می شود. به طور معمول، این کار پس از انجام موفقیت آمیز یک عمل انجام می شود، زمانی که یک پیام موفقیت آمیز را به جلسه فلش می کنید. برای راحتی، میتوانید یک
RedirectResponse
نمونه ایجاد کنید و دادهها را در یک زنجیره روش روان و روان در جلسه ایجاد کنید:
Route::post('/user/profile', function () { // ... return redirect('dashboard')->with('status', 'Profile updated!');});
پس از هدایت کاربر، می توانید پیام فلش شده از جلسه را نمایش دهید . به عنوان مثال، با استفاده از دستور Blade :
@if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div>@endif
تغییر مسیر با ورودی
می توانید از
withInput
روش ارائه شده توسط
RedirectResponse
نمونه برای فلش کردن داده های ورودی درخواست فعلی به جلسه قبل از هدایت کاربر به مکان جدید استفاده کنید. این معمولاً در صورتی انجام می شود که کاربر با خطای اعتبارسنجی مواجه شده باشد. هنگامی که ورودی به جلسه فلش شد، می توانید به راحتی
آن را
در طول درخواست بعدی برای پر کردن مجدد فرم بازیابی کنید:
return back()->withInput();
انواع دیگر پاسخ
کمک
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);
Symfony HttpFoundation، که دانلود فایل ها را مدیریت می کند، نیاز دارد که فایل در حال دانلود دارای نام فایل ASCII باشد.
دانلودهای جریانی
گاهی اوقات ممکن است بخواهید پاسخ رشته ای یک عملیات معین را بدون نیاز به نوشتن محتویات عملیات روی دیسک به یک پاسخ قابل دانلود تبدیل کنید. در این سناریو
می توانید از
streamDownload
روش استفاده کنید. این متد یک فراخوان، نام فایل و یک آرایه اختیاری از هدرها را به عنوان آرگومان های خود می پذیرد:
use App\Services\GitHub; 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
برنامه خود
، مانند
ارائه دهنده خدمات فراخوانی کنید:
App\Providers\AppServiceProvider
<?php namespace App\Providers; use Illuminate\Support\Facades\Response;use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider{ /** * Bootstrap any application services. */ public function boot(): void { Response::macro('caps', function (string $value) { return Response::make(strtoupper($value)); }); }}
تابع
macro
یک نام را به عنوان اولین آرگومان خود و یک بسته را به عنوان آرگومان دوم خود می پذیرد. بسته شدن ماکرو هنگام فراخوانی نام ماکرو از یک
ResponseFactory
پیاده سازی یا
response
کمک کننده اجرا می شود:
return response()->caps('foo');