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

Запити HTTP

Доступ до запиту

Щоб отримати екземпляр поточного запиту 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');

        //
    }
}

Параметри ін’єкції залежності та маршруту

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

use App\Http\Controllers\UserController;

Route::put('user/{id}', [UserController::class, 'update']);

Ви все ще можете навести натяк наIlluminate\Http\Requestі отримати доступ до параметра маршрутуidвизначивши метод свого контролера наступним чином:

<?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)
    {
        //
    }
}

Доступ до запиту через перекриття маршрутів

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

use Illuminate\Http\Request;

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

Шлях і метод запиту

Illuminate\Http\Requestекземпляр надає різноманітні методи для перевірки HTTP-запиту для вашої програми та розширюєSymfony\Component\HttpFoundation\Requestклас. Нижче ми обговоримо кілька найважливіших методів.

Отримання шляху запиту

pathметод повертає інформацію про шлях запиту. Отже, якщо вхідний запит націлений наhttp://domain.com/foo/bar,pathметод повернетьсяfoo/bar:

$uri = $request->path();

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

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

Отримання URL-адреси запиту

Щоб отримати повну URL-адресу вхідного запиту, ви можете використовуватиurlабоfullUrlметоди.urlметод поверне 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 використовує_Міст повідомлень HTTP Symfony_компонент для перетворення типових запитів та відповідей Laravel у реалізації, сумісні з PSR-7:

composer require symfony/psr-http-message-bridge
composer require nyholm/psr7

Після встановлення цих бібліотек ви можете отримати запит PSR-7, натякнувши тип інтерфейсу запиту на ваш маршрут Закриття або метод контролера:

use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
    //
});
Якщо ви повернете екземпляр відповіді PSR-7 з маршруту або контролера, він автоматично буде перетворений назад у екземпляр відповіді Laravel і відображатиметься в рамках.

Обрізання та нормалізація введення

За замовчуванням Laravel включаєTrimStringsіConvertEmptyStringsToNullMiddlware у глобальному стеку проміжного програмного забезпечення вашої програми. Це Middlware перелічено в стекуApp\Http\Kernelклас. Це Middlware автоматично обрізає всі поля вхідних рядків у запиті, а також перетворить будь-які порожні поля рядків уnull. Це дозволяє вам не турбуватися про ці проблеми з нормалізацією у ваших маршрутах та контролерах.

Якщо ви хочете відключити цю поведінку, ви можете видалити два проміжні програми зі стеку проміжного програмного забезпечення вашої програми, видаливши їх із$middlewareвласність вашогоApp\Http\Kernelклас.

Отримання вводу

Отримання всіх вхідних даних

Ви також можете отримати всі вхідні дані якarrayза допомогоюallметод:

$input = $request->all();

Отримання вхідного значення

За допомогою кількох простих методів ви можете отримати доступ до всіх введених користувачем даних із вашогоIlluminate\Http\Requestекземпляр, не турбуючись про те, яке дієслово HTTP було використано для запиту. Незалежно від дієслова HTTP,inputметод може бути використаний для отримання вводу користувача:

$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();

Отримання вводу через динамічні властивості

You may also access user input using dynamic properties on the Illuminate\Http\Requestінстанції. Наприклад, якщо одна з форм вашої програми міститьnameполе, ви можете отримати доступ до значення поля таким чином:

$name = $request->name;

При використанні динамічних властивостей Laravel спочатку шукатиме значення параметра в корисному навантаженні запиту. Якщо його немає, Laravel буде шукати поле в параметрах маршруту.

Отримання вхідних значень JSON

Надсилаючи запити JSON до вашої програми, ви можете отримати доступ до даних JSON черезinputметод, докиContent-TypeЗаголовок запиту правильно встановленийapplication/json. Ви навіть можете використовувати синтаксис "крапка", щоб копатись у масивах JSON:

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

Отримання булевих вхідних значень

При роботі з елементами HTML, такими як прапорці, ваш додаток може отримувати "істинні" значення, які насправді є рядками. Наприклад, "true" або "on". Для зручності ви можете використовуватиbooleanметод отримати ці значення як логічні.booleanметод повертаєtrueдля 1, "1", true, "true", "on" та "yes". Усі інші значення повернутьсяfalse:

$archived = $request->boolean('archived');

Отримання частини вхідних даних

Якщо вам потрібно отримати підмножину вхідних даних, ви можете використовуватиonlyіexceptметоди. Обидва ці методи приймають одинarrayабо динамічний список аргументів:

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

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

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

$input = $request->except('credit_card');
Theonlyметод повертає всі пари ключ / значення, які ви запитуєте; однак він не поверне пари ключ / значення, яких немає у запиті.

Визначення наявності вхідного значення

Ви повинні використовуватиhasметод, щоб визначити, чи є значення в запиті.hasметод повертаєtrueякщо значення присутнє на запит:

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

Коли дається масив,hasметод визначає, чи є всі вказані значення:

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

whenHasметод виконає заданий зворотний виклик, якщо у запиті присутнє значення:

$request->whenHas('name', function ($input) {
    //
});

hasAnyметод повертаєtrueякщо є якесь із зазначених значень:

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

Якщо ви хочете визначити, чи є значення у запиті і не є порожнім, ви можете використовуватиfilledметод:

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

whenFilledметод виконає даний зворотний виклик, якщо в запиті присутнє значення, яке не є порожнім:

$request->whenFilled('name', function ($input) {
    //
});

Щоб визначити, чи відсутній даний ключ у запиті, ви можете використовуватиmissingметод:

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

Старий вхід

Laravel дозволяє зберегти вхідні дані одного запиту під час наступного запиту. Ця функція особливо корисна для повторного заповнення форм після виявлення помилок перевірки. Однак, якщо ви використовуєте Laravel'sфункції перевірки, навряд чи вам доведеться використовувати ці методи вручну, оскільки деякі вбудовані засоби перевірки Laravel викликатимуть їх автоматично.

Миготливий вхід на сесію

flashметод наIlluminate\Http\Requestclass буде блимати поточним входом досесіящоб він був доступний під час наступного запиту користувача до програми:

$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') }}">

Печиво

Отримання файлів cookie із запитів

Усі файли cookie, створені фреймворком Laravel, зашифровані та підписані кодом автентифікації, тобто вони вважатимуться недійсними, якщо їх змінив клієнт. Щоб отримати значення файлу cookie із запиту, використовуйтеcookieметод наIlluminate\Http\Requestпримірник:

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

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

use Illuminate\Support\Facades\Cookie;

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

Прикріплення файлів cookie до відповідей

Ви можете додати файл cookie до вихідногоIlluminate\Http\Responseекземпляр за допомогоюcookieметод. Вам слід передати ім'я, значення та кількість хвилин, коли файл cookie повинен вважатися дійсним для цього методу:

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

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

return response('Hello World')->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

Якщо ви хочете створити файлSymfony\Component\HttpFoundation\Cookieекземпляр, який може бути наданий екземпляру відповіді пізніше, ви можете використовувати глобальнийcookieпомічник. Цей файл cookie не буде відправлений назад клієнту, якщо він не приєднаний до екземпляра відповіді:

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

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

Термін дії кукі-файлів закінчується достроково

Ви можете видалити файл cookie, закінчивши термін його дії черезforgetметодCookieфасад:

Cookie::queue(Cookie::forget('name'));

Крім того, ви можете приєднати прострочений файл cookie до екземпляра відповіді:

$cookie = Cookie::forget('name');

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

Файли

Отримання завантажених файлів

Ви можете отримати доступ до завантажених файлів ізIlluminate\Http\Requestекземпляр за допомогоюfileметодом або з використанням динамічних властивостей.fileметод повертає екземплярIlluminate\Http\UploadedFileклас, який розширює PHPSplFileInfoклас і надає різноманітні методи взаємодії з файлом:

$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 і не знає, що повинна генерувати безпечні посилання.

Для вирішення цього питання ви можете використовуватиApp\Http\Middleware\TrustProxiesMiddlware, що входить до вашої програми Laravel, що дозволяє швидко налаштувати балансири навантаження або проксі-сервери, яким ваша програма повинна довіряти. Ваші довірені проксі-сервери повинні бути вказані як масив на$proxiesвластивість цього проміжного програмного забезпечення. Окрім налаштування надійних проксі-серверів, ви можете налаштувати і проксі-сервер$headersякому слід довіряти:

<?php

namespace App\Http\Middleware;

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

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

    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
Якщо ви використовуєте AWS Elastic Balancing Load, ваш$headersзначення має бутиRequest::HEADER_X_FORWARDED_AWS_ELB. Для отримання додаткової інформації про константи, які можуть бути використані в$headers, перегляньте документацію Symfony щододовірливі довірені особи.

Довіра всім довіреним особам

Якщо ви використовуєте Amazon AWS або іншого "хмарного" постачальника балансирів навантаження, ви можете не знати IP-адреси своїх фактичних балансирів. У цьому випадку ви можете використовувати*довіряти всім довіреним особам:

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