Unetway

Laravel - HTTP Responses

Создание ответов

Строки и массивы

Все маршруты и контроллеры должны возвращать ответ для отправки обратно в браузер пользователя. Laravel предоставляет несколько разных способов возврата ответов. Самый простой ответ - возврат строки из маршрута или контроллера. Фреймворк автоматически преобразует строку в полный HTTP-ответ:

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

Помимо возврата строк из ваших маршрутов и контроллеров, вы также можете возвращать массивы. Фреймворк автоматически преобразует массив в ответ JSON:

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

 

Знаете ли вы, что вы также можете вернуть коллекции Eloquent с ваших маршрутов или контроллеров? Они будут автоматически преобразованы в JSON. Дать ему шанс!

Объекты ответа

Как правило, вы не просто будете возвращать простые строки или массивы из действий маршрута. Вместо этого вы будете возвращать полные экземпляры или представления.Illuminate\Http\Response

Возврат полного Responseэкземпляра позволяет настроить HTTP-код ответа и заголовки. ResponseЭкземпляр наследует от класса, который обеспечивает различные методы для построения ответов HTTP:Symfony\Component\HttpFoundation\Response

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

n

Прикрепление заголовков к ответам

Имейте в виду, что большинство методов ответа являются цепочечными, что позволяет быстро создавать экземпляры ответов. Например, вы можете использовать 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',
            ]);
Промежуточное ПО для управления кэшем

Laravel включает промежуточное программное обеспечение, которое можно использовать для быстрой установки заголовка для группы маршрутов. Если указано в списке директив, MD5-хэш содержимого ответа будет автоматически установлен в качестве идентификатора ETag:cache.headersCache-Controletag

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

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

 

Прикрепление файлов cookie к ответам

cookieМетод по инстанциям ответа позволяет легко прикрепить печенье к ответу. Например, вы можете использовать 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фасад, чтобы «поставить в очередь» файлы cookie для прикрепления к исходящему ответу из вашего приложения. queueМетод принимает Cookieэкземпляр или аргументы , необходимые для создания Cookieэкземпляра. Эти файлы cookie будут прикреплены к исходящему ответу до его отправки в браузер:

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

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

 

Файлы cookie и шифрование

По умолчанию все файлы cookie, сгенерированные Laravel, зашифрованы и подписаны, поэтому они не могут быть изменены или прочитаны клиентом. Если вы хотите отключить шифрование для подмножества файлов cookie, сгенерированных вашим приложением, вы можете использовать $exceptсвойство промежуточного программного обеспечения, которое находится в каталоге:App\Http\Middleware\EncryptCookiesapp/Http/Middleware

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

 

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

Ответы на перенаправление являются экземплярами класса и содержат надлежащие заголовки, необходимые для перенаправления пользователя на другой URL-адрес. Есть несколько способов создать экземпляр. Самый простой способ - использовать глобальный помощник:Illuminate\Http\RedirectResponseRedirectResponseredirect

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\RedirectorRedirectorRedirectResponseroute

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

Если у вашего маршрута есть параметры, вы можете передать их в качестве второго аргумента routeметоду:

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

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

Заполнение параметров с помощью красноречивых моделей

Если вы перенаправляете на маршрут с параметром «ID», который заполняется из модели Eloquent, вы можете передать саму модель. Идентификатор будет извлечен автоматически:

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

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

Если вы хотите настроить значение, которое помещается в параметр маршрута, вы должны переопределить 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Метод автоматически устанавливает заголовок , а также преобразовать данный массив JSON с помощью функции PHP:Content-Typeapplication/jsonjson_encode

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\ServiceProvider;
use Illuminate\Support\Facades\Response;

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