Версія фреймворка: 8.x

Відповіді HTTP

Створення відповідей

Струни та масиви

Усі маршрути та контролери повинні повертати відповідь, яку потрібно відправити назад у браузер користувача. Laravel пропонує кілька різних способів повернути відповіді. Найпростіша відповідь - повернення рядка з маршруту або контролера. Фреймворк автоматично перетворить рядок у повну відповідь HTTP:

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

На додаток до повернення рядків із ваших маршрутів та контролерів, ви також можете повернути масиви. Фреймворк автоматично перетворить масив у відповідь JSON:

Route::get('/', function () {
    return [1, 2, 3];
});
Чи знали ви, що можете також повернутисяКрасномовні колекціїзі своїх маршрутів чи контролерів? Вони будуть автоматично перетворені в JSON. Спробуй!

Об'єкти відповіді

Як правило, ви не просто повертаєте прості рядки або масиви з ваших дій маршруту. Натомість ти повернешся повнимIlluminate\Http\Responseекземпляри абопогляди.

Повернення повногоResponseекземпляр дозволяє налаштувати код стану HTTP та заголовки відповіді. AResponseекземпляр успадковує відSymfony\Component\HttpFoundation\Response class, which provides a variety of methods for building HTTP responses:

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',
            ]);

Керування кешем Middlware

Laravel включає acache.headersMiddlware, яке можна використовувати для швидкого встановлення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метод на примірниках відповідей дозволяє легко приєднати до відповіді файли cookie. Наприклад, ви можете використовуватиcookieметод генерувати cookie і вільно приєднувати його до екземпляра відповіді так:

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

cookieметод також приймає ще кілька аргументів, які використовуються рідше. Як правило, ці аргументи мають ту саму мету та значення, що й аргументи, які будуть надані рідному PHPsetcookieметод:

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

Крім того, ви можете використовуватиCookieфасад до файлів cookie "в черзі" для прикріплення до вихідної відповіді вашої програми.queueметод приймає aCookieекземпляр або аргументи, необхідні для створення aCookieекземпляр. Ці файли cookie буде додано до вихідної відповіді до того, як її буде надіслано браузеру:

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

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

Файли cookie та шифрування

За замовчуванням усі файли cookie, створені Laravel, шифруються та підписуються, щоб клієнт не міг їх змінити чи прочитати. Якщо ви хочете відключити шифрування для підмножини файлів cookie, створених вашою програмою, ви можете використовувати$exceptвласністьApp\Http\Middleware\EncryptCookiesMiddlware, яке знаходиться вapp/Http/Middlewareкаталог:

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

Перенаправлення

Переадресаційні відповіді є прикладамиIlluminate\Http\RedirectResponseкласу та містять відповідні заголовки, необхідні для перенаправлення користувача на іншу URL-адресу. Є кілька способів генерувати aRedirectResponseекземпляр. Найпростіший метод - використання глобальногоredirectпомічник:

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

Іноді вам може знадобитися перенаправити користувача у попереднє місце розташування, наприклад, коли надіслана форма недійсна. Ви можете зробити це, використовуючи глобальнийbackдопоміжна функція. Оскільки ця функція використовуєсесія, переконайтеся, що маршрут викликає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 method:

// 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]);

Якщо ви хочете налаштувати значення, яке розміщується в параметрі маршруту, ви можете вказати стовпець у визначенні параметра маршруту (profile/{id:slug}) або ви можете замінитиgetRouteKeyметод на вашій красномовній моделі:

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

Перенаправлення на дії контролера

Ви також можете генерувати переспрямування надії контролера. Для цього передайте контролер та ім'я дії вactionметод:

use App\Http\Controllers\HomeController;

return redirect()->action([HomeController::class, 'index']);

Якщо ваш маршрут контролера вимагає параметрів, ви можете передати їх як другий аргумент доactionметод:

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

Перенаправлення на зовнішні домени

Іноді вам може знадобитися перенаправити на домен за межами вашої програми. Ви можете зробити це, зателефонувавши доawayметод, який створює aRedirectResponseбез будь-якого додаткового кодування, перевірки чи перевірки 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

Інші типи відповідей

responsehelper може використовуватися для генерації інших типів екземплярів відповідей. Колиresponsehelper викликається без аргументів, реалізаціяIlluminate\Contracts\Routing\ResponseFactoryконтрактповертається. Цей контракт надає кілька корисних методів для отримання відповідей.

Переглянути відповіді

Якщо вам потрібен контроль над статусом відповіді та заголовками, але вам також потрібно повернути aвидяк зміст відповіді слід використовуватиviewметод:

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

Звичайно, якщо вам не потрібно передавати власний код стану HTTP або власні заголовки, вам слід використовувати глобальнийviewдопоміжна функція.

Відповіді JSON

The jsonметод автоматично встановитьContent-Typeзаголовок доapplication/json, а також перетворити даний масив у JSON за допомогоюjson_encodeФункція PHP:

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фасад. Наприклад, з aпостачальника послуг 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Функція приймає ім'я як перший аргумент, а Закриття як другий аргумент. Закриття макросу буде виконано при виклику імені макроса зResponseFactoryвпровадження абоresponseпомічник:

return response()->caps('foo');