Unetway

Laravel - HTTP Requests

Доступ к запросу

Чтобы получить экземпляр текущего HTTP-запроса через внедрение зависимостей, вы должны указать класс в методе контроллера. Экземпляр входящего запроса будет автоматически добавлен сервисным контейнером :Illuminate\Http\Request

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Store a new user.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }
}

Внедрение зависимостей и параметры маршрута

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

Route::put('user/{id}', 'UserController@update');

Вы все еще можете напечатать подсказку и получить доступ к параметру маршрута , определив метод контроллера следующим образом:Illuminate\Http\Requestid

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Update the specified user.
     *
     * @param  Request  $request
     * @param  string  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

Доступ к запросу через закрытие маршрута

Вы также можете напечатать класс на маршруте Закрытие. Служебный контейнер автоматически внедрит входящий запрос в Closure, когда он будет выполнен:Illuminate\Http\Request

use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
    //
});

 

Путь и метод запроса

Экземпляр предоставляет различные методы для изучения запроса HTTP для вашего приложения и расширяет класс. Мы обсудим некоторые из наиболее важных методов ниже.Illuminate\Http\RequestSymfony\Component\HttpFoundation\Request

Получение пути запроса

pathМетод возвращает информацию о пути в запросе. Итак, если на входящий запрос нацелен , метод вернет :http://domain.com/foo/barpathfoo/bar

$uri = $request->path();

isМетод позволяет проверить , что входящий путь запроса соответствует заданному шаблону. Вы можете использовать *символ в качестве подстановочного знака при использовании этого метода:

if ($request->is('admin/*')) {
    //
}

Получение запроса URL

Чтобы получить полный URL-адрес для входящего запроса, вы можете использовать методы urlили fullUrlurlМетод возвращает URL без строки запроса, в то время как fullUrlметод включает в себя строку запроса:

// Without Query String...
$url = $request->url();

// With Query String...
$url = $request->fullUrl();

Получение метода запроса

methodМетод возвращает глагол HTTP для запроса. Вы можете использовать isMethodметод, чтобы убедиться, что глагол HTTP соответствует заданной строке:

$method = $request->method();

if ($request->isMethod('post')) {
    //
}

 

PSR-7 Запросы

Стандарт PSR-7 определяет интерфейсы для сообщений HTTP, включая запросы и ответы. Если вы хотите получить экземпляр запроса PSR-7 вместо запроса Laravel, вам сначала необходимо установить несколько библиотек. Laravel использует компонент Symfony HTTP Message Bridge для преобразования типичных запросов и ответов Laravel в реализации, совместимые с PSR-7:

composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros

После того, как вы установили эти библиотеки, вы можете получить запрос PSR-7, указав интерфейс запроса на вашем методе Closure или контроллере маршрута:

use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
    //
});

Если вы возвращаете экземпляр ответа PSR-7 из маршрута или контроллера, он автоматически преобразуется обратно в экземпляр ответа Laravel и отображается платформой.

 

Подстройка входного сигнала и нормализация

По умолчанию Laravel включает TrimStringsи ConvertEmptyStringsToNullпромежуточное ПО в глобальный стек промежуточного ПО вашего приложения. Эти промежуточные программы перечислены в стеке классом. Это промежуточное ПО автоматически обрезает все входящие строковые поля по запросу, а также преобразует любые пустые строковые поля в . Это позволяет вам не беспокоиться об этих проблемах нормализации в ваших маршрутах и ​​контроллерах.App\Http\Kernelnull

Если вы хотите отключить это поведение, вы можете удалить два промежуточных программного обеспечения из стека промежуточного программного обеспечения вашего приложения, удалив их из $middlewareсвойства вашего класса.App\Http\Kernel

 

Получение ввода

Получение всех входных данных

Вы также можете получить все входные данные, arrayиспользуя allметод:

$input = $request->all();

Получение входного значения

Используя несколько простых методов, вы можете получить доступ ко всем пользовательским данным из вашего экземпляра, не беспокоясь о том, какой HTTP-глагол был использован для запроса. Независимо от HTTP-глагола, метод может быть использован для извлечения пользовательского ввода:Illuminate\Http\Requestinput

$name = $request->input('name');

Вы можете передать значение по умолчанию в качестве второго аргумента inputметода. Это значение будет возвращено, если запрошенное входное значение отсутствует в запросе:

$name = $request->input('name', 'Sally');

При работе с формами, содержащими входные данные массива, используйте обозначение «точка» для доступа к массивам:

$name = $request->input('products.0.name');

$names = $request->input('products.*.name');

Вы можете вызвать inputметод без каких-либо аргументов, чтобы извлечь все входные значения в виде ассоциативного массива:

$input = $request->input();

Получение входных данных из строки запроса

В то время как inputметод извлекает значения из всей полезной нагрузки запроса (включая строку запроса), queryметод извлекает значения только из строки запроса:

$name = $request->query('name');

Если запрошенные данные значения строки запроса отсутствуют, будет возвращен второй аргумент этого метода:

$name = $request->query('name', 'Helen');

Вы можете вызвать queryметод без каких-либо аргументов, чтобы получить все значения строки запроса в виде ассоциативного массива:

$query = $request->query();

Получение входных данных через динамические свойства

Вы также можете получить доступ к пользовательскому вводу, используя динамические свойства экземпляра. Например, если одна из форм вашего приложения содержит поле, вы можете получить доступ к значению поля следующим образом:Illuminate\Http\Requestname

$name = $request->name;

При использовании динамических свойств Laravel сначала будет искать значение параметра в полезной нагрузке запроса. Если его нет, Laravel будет искать поле в параметрах маршрута.

Получение входных значений JSON

При отправке запросов JSON в ваше приложение вы можете получить доступ к данным JSON с помощью inputметода, если заголовок запроса правильно установлен на . Вы даже можете использовать синтаксис "точка", чтобы копаться в массивах JSON:Content-Typeapplication/json

$name = $request->input('user.name');

Получение части входных данных

Если вам нужно получить подмножество входных данных, вы можете использовать onlyи exceptметоду. Оба эти метода принимают один arrayили динамический список аргументов:

$input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

onlyМетод возвращает все пары ключ / значение , которые вы запрашиваете; однако он не будет возвращать пары ключ / значение, которые отсутствуют в запросе.

Определение наличия входного значения

Вы должны использовать hasметод, чтобы определить, присутствует ли значение в запросе. hasМетод возвращает , trueесли значение присутствует на запросе:

if ($request->has('name')) {
    //
}

Когда задан массив, hasметод определит, присутствуют ли все указанные значения:

if ($request->has(['name', 'email'])) {
    //
}

Если вы хотите определить, присутствует ли значение в запросе и не является ли оно пустым, вы можете использовать filledметод:

if ($request->filled('name')) {
    //
}

 

Старый вход

Laravel позволяет вам сохранить ввод от одного запроса во время следующего запроса. Эта функция особенно полезна для повторного заполнения форм после обнаружения ошибок проверки. Однако, если вы используете встроенные функции проверки Laravel , вряд ли вам придется использовать эти методы вручную, поскольку некоторые из встроенных средств проверки Laravel будут вызывать их автоматически.

Мигает вход в сессию

flashМетод на классе будет мигать текущий вход на сессию , так что он доступен во время следующего запроса пользователя к приложению:Illuminate\Http\Request

$request->flash();

Вы можете также использовать flashOnlyи flashExceptметоду прошить подмножество данных запроса на сессию. Эти методы полезны для хранения конфиденциальной информации, такой как пароли, вне сеанса:

$request->flashOnly(['username', 'email']);

$request->flashExcept('password');

Мигающий ввод, затем перенаправление

Поскольку вам часто захочется перенести ввод в сеанс, а затем перенаправить на предыдущую страницу, вы можете легко соединить мигающий ввод с перенаправлением, используя withInputметод:

return redirect('form')->withInput();

return redirect('form')->withInput(
    $request->except('password')
);

Получение старого ввода

Для извлечения введенных данных из предыдущего запроса используйте oldметод в Requestэкземпляре. oldМетод будет тянуть ранее мелькнула входные данные из сессии :

$username = $request->old('username');

Laravel также предоставляет глобального oldпомощника. Если вы отображаете старый ввод в шаблоне Blade , более удобно использовать oldпомощника. Если для данного поля не существует старого ввода, nullбудет возвращено:

<input type="text" name="username" value="{{ old('username') }}">

 

Печенье

Получение Cookies из запросов

Все файлы cookie, создаваемые платформой Laravel, шифруются и подписываются кодом аутентификации, что означает, что они будут считаться недействительными, если они были изменены клиентом. Чтобы получить значение cookie из запроса, используйте cookieметод в экземпляре:Illuminate\Http\Request

$value = $request->cookie('name');

Кроме того, вы можете использовать Cookieфасад для доступа к значениям cookie:

$value = Cookie::get('name');

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

Вы можете прикрепить cookie к исходящему экземпляру, используя метод. Вы должны передать имя, значение и количество минут, в течение которых cookie должен считаться действительным для этого метода:Illuminate\Http\Responsecookie

return response('Hello World')->cookie(
    'name', 'value', $minutes
);

cookieМетод также принимает несколько аргументов , которые используются реже. Как правило, эти аргументы имеют ту же цель и значение, что и аргументы, которые будут переданы нативномуметоду setcookie в PHP :

return response('Hello World')->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 не будет отправлен обратно клиенту, если он не присоединен к экземпляру ответа:Symfony\Component\HttpFoundation\Cookiecookie

$cookie = cookie('name', 'value', $minutes);

return response('Hello World')->cookie($cookie);

 

Файлы

Получение загруженных файлов

Вы можете получить доступ к загруженным файлам из экземпляра, используя метод или используя динамические свойства. Метод возвращает экземпляр класса, который расширяет PHP класс и предоставляет множество методов для взаимодействия с файлом:Illuminate\Http\RequestfilefileIlluminate\Http\UploadedFileSplFileInfo

$file = $request->file('photo');

$file = $request->photo;

Вы можете определить, присутствует ли файл в запросе, используя hasFileметод:

if ($request->hasFile('photo')) {
    //
}

Проверка успешных загрузок

Помимо проверки наличия файла, вы можете убедиться, что не было проблем с загрузкой файла с помощью isValidметода:

if ($request->file('photo')->isValid()) {
    //
}

Пути к файлам и расширения

UploadedFileКласс также содержит методы для получения доступа полного пути к файлу и его расширения. extensionМетод будет пытаться угадать расширение файла на основе его содержания. Это расширение может отличаться от расширения, предоставленного клиентом:

$path = $request->photo->path();

$extension = $request->photo->extension();

Другие методы файла

Есть множество других методов, доступных на UploadedFileэкземплярах. Ознакомьтесь с документацией API для класса для получения дополнительной информации об этих методах.

 

Хранение загруженных файлов

Для хранения загруженного файла вы обычно будете использовать одну из настроенных файловых систем . У UploadedFileкласса есть storeметод, который перемещает загруженный файл на один из ваших дисков, который может быть местом в вашей локальной файловой системе или даже в облачном хранилище, таком как Amazon S3.

storeМетод принимает путь к файлу должен быть сохранен относительно настроенного корневого каталога в файловой системе в. Этот путь не должен содержать имя файла, так как уникальный идентификатор будет автоматически сгенерирован в качестве имени файла.

storeМетод также принимает необязательный второй аргумент для имени диска , который должен использоваться для хранения файла. Метод вернет путь к файлу относительно корня диска:

$path = $request->photo->store('images');

$path = $request->photo->store('images', 's3');

Если вы не хотите, чтобы имя файла создавалось автоматически, вы можете использовать storeAsметод, который принимает в качестве аргументов путь, имя файла и имя диска:

$path = $request->photo->storeAs('images', 'filename.jpg');

$path = $request->photo->storeAs('images', 'filename.jpg', 's3');

 

Настройка доверенных прокси

При запуске ваших приложений за балансировщиком нагрузки, который завершает сертификаты TLS / SSL, вы можете заметить, что ваше приложение иногда не генерирует HTTPS-ссылки. Обычно это происходит потому, что ваше приложение перенаправляет трафик с вашего балансировщика нагрузки на порт 80 и не знает, что оно должно генерировать защищенные ссылки.

Чтобы решить эту проблему, вы можете использовать промежуточное программное обеспечение, входящее в ваше приложение Laravel, которое позволяет вам быстро настроить балансировщики нагрузки или прокси-серверы, которым ваше приложение должно доверять. Ваши доверенные прокси должны быть указаны в виде массива в свойстве этого промежуточного программного обеспечения. В дополнение к настройке доверенных прокси вы можете настроить доверенный прокси :App\Http\Middleware\TrustProxies$proxies$headers

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */
    protected $proxies = [
        '192.168.1.1',
        '192.168.1.2',
    ];

    /**
     * The headers that should be used to detect proxies.
     *
     * @var string
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

Если вы используете AWS Elastic Load Balancing, ваше $headersзначение должно быть таким . Для получения дополнительной информации о константах, которые могут использоваться в свойстве, ознакомьтесь с документацией Symfony о доверяющих прокси .Request::HEADER_X_FORWARDED_AWS_ELB$headers

Доверие всем прокси

Если вы используете Amazon AWS или другого «облачного» поставщика балансировщика нагрузки, вы можете не знать IP-адреса ваших реальных балансировщиков. В этом случае вы можете использовать *доверять всем прокси:

/**
 * The trusted proxies for this application.
 *
 * @var array
 */
protected $proxies = '*';