نسخه:

پاسخ های 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');