Описание

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

webman автоматически вставляет объект запроса в первый параметр метода действия, например:

Пример

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        $default_name = 'webman';
        // Получить параметр name из GET-запроса, если параметр name не передан, вернуть $default_name
        $name = $request->get('name', $default_name);
        // Вернуть строку браузеру
        return response('hello ' . $name);
    }
}

С помощью объекта $request мы можем получить любые данные, относящиеся к запросу.

Иногда мы хотим в других классах получить текущий объект request, в этом случае мы можем использовать вспомогательную функцию request();

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

Получить весь массив get

$request->get();

Если запрос не содержит параметров get, будет возвращен пустой массив.

Получить одно значение из массива get

$request->get('name');

Если в массиве get нет этого значения, будет возвращен null.

Вы также можете передать вторым параметром метода get значение по умолчанию; если в массиве get не будет найдено соответствующее значение, будет возвращено значение по умолчанию. Например:

$request->get('name', 'tom');

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

Получить весь массив post

$request->post();

Если запрос не содержит параметров post, будет возвращен пустой массив.

Получить одно значение из массива post

$request->post('name');

Если в массиве post нет этого значения, будет возвращен null.

Аналогично методу get, вы можете передать вторым параметром метода post значение по умолчанию; если в массиве post не будет найдено соответствующее значение, будет возвращено значение по умолчанию. Например:

$request->post('name', 'tom');

Вспомогательная функция input()

Как и функция $request->input(), она может получить все параметры, вспомогательная функция input() имеет два параметра:

  1. name: имя параметра (если пусто, можно получить массив всех параметров)
  2. default: значение по умолчанию (если первый параметр не удалось получить, будет использовано это значение)

Например

// Получить параметр name
$name = input('name');
// Получить параметр name, если он не существует, использовать значение по умолчанию
$name = input('name','张三');
// Получить все параметры
$all_params = input();

Получение исходного тела запроса post

$post = $request->rawBody();

Эта функция аналогична операции file_get_contents("php://input"); в php-fpm, используется для получения тела оригинального http-запроса. Это очень полезно для получения данных post-запроса, не имеющих формат application/x-www-form-urlencoded.

Получение заголовков

Получить весь массив заголовков

$request->header();

Если запрос не содержит заголовков, будет возвращен пустой массив. Обратите внимание, что все ключи в нижнем регистре.

Получить одно значение из массива заголовков

$request->header('host');

Если в массиве заголовков нет этого значения, будет возвращен null. Обратите внимание, что все ключи в нижнем регистре.

Аналогично методу get, вы также можете передать вторым параметром метода header значение по умолчанию; если в массиве заголовков не будет найдено соответствующее значение, будет возвращено значение по умолчанию. Например:

$request->header('host', 'localhost');

Получение cookie

Получить весь массив cookie

$request->cookie();

Если запрос не содержит параметров cookie, будет возвращен пустой массив.

Получить одно значение из массива cookie

$request->cookie('name');

Если в массиве cookie нет этого значения, будет возвращен null.

Аналогично методу get, вы также можете передать вторым параметром метода cookie значение по умолчанию; если в массиве cookie не будет найдено соответствующее значение, будет возвращено значение по умолчанию. Например:

$request->cookie('name', 'tom');

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

Содержит объединение post и get.

$request->all();

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

Получение определенного значения из объединения post и get.

$request->input('name', $default_value);

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

Получение части данных из объединения post и get.

// Получить массив, состоящий из username и password, если соответствующие ключи отсутствуют, игнорируем
$only = $request->only(['username', 'password']);
// Получить все входные данные, кроме avatar и age
$except = $request->except(['avatar', 'age']);

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

<?php
namespace app\controller;
use support\Response;

class UserController
{
    public function create(string $name, int $age = 18): Response
    {
        return json(['name' => $name, 'age' => $age]);
    }
}

Логика кода аналогична

<?php
namespace app\controller;
use support\Request;
use support\Response;

class UserController
{
    public function create(Request $request): Response
    {
        $name = $request->input('name');
        $age = (int)$request->input('age', 18);
        return json(['name' => $name, 'age' => $age]);
    }
}

Дополнительную информацию смотрите в Привязка параметров контроллера

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

Подсказка
Для загрузки файлов необходимо использовать форму с кодировкой multipart/form-data

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

$request->file();

Форма выглядит примерно так:

<form method="post" action="http://127.0.0.1:8787/upload/files" enctype="multipart/form-data" />
<input name="file1" multiple="multiple" type="file">
<input name="file2" multiple="multiple" type="file">
<input type="submit">
</form>

Формат, возвращаемый $request->file(), аналогичен:

array (
    'file1' => object(webman\Http\UploadFile),
    'file2' => object(webman\Http\UploadFile)
)

Это массив экземпляров webman\Http\UploadFile. Класс webman\Http\UploadFile наследует встроенный в PHP класс SplFileInfo и предлагает несколько полезных методов.

<?php
namespace app\controller;

use support\Request;

class UploadController
{
    public function files(Request $request)
    {
        foreach ($request->file() as $key => $spl_file) {
            var_export($spl_file->isValid()); // Проверить, валиден ли файл, например true|false
            var_export($spl_file->getUploadExtension()); // Получить расширение загружаемого файла, например 'jpg'
            var_export($spl_file->getUploadMimeType()); // Получить MIME тип загружаемого файла, например 'image/jpeg'
            var_export($spl_file->getUploadErrorCode()); // Получить код ошибки загрузки, например UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
            var_export($spl_file->getUploadName()); // Получить имя загружаемого файла, например 'my-test.jpg'
            var_export($spl_file->getSize()); // Получить размер файла, например 13364, в байтах
            var_export($spl_file->getPath()); // Получить каталог загрузки, например '/tmp'
            var_export($spl_file->getRealPath()); // Получить путь к временному файлу, например '/tmp/workerman.upload.SRliMu'
        }
        return response('ok');
    }
}

Важно:

  • После загрузки файл будет переименован во временный файл, например /tmp/workerman.upload.SRliMu
  • Размер загружаемого файла ограничен defaultMaxPackageSize, по умолчанию 10 Мб, его можно изменить в файле config/server.php изменив max_package_size.
  • После завершения запроса временные файлы будут автоматически очищены.
  • Если запрос не содержит загруженных файлов, то $request->file() вернет пустой массив.
  • Загруженные файлы не поддерживают метод move_uploaded_file(), вместо этого используйте метод $file->move(), см. следующий пример.

Получение конкретного загруженного файла

$request->file('avatar');

Если файл существует, будет возвращен соответствующий экземпляр webman\Http\UploadFile, в противном случае будет возвращен null.

Пример

<?php
namespace app\controller;

use support\Request;

class UploadController
{
    public function file(Request $request)
    {
        $file = $request->file('avatar');
        if ($file && $file->isValid()) {
            $file->move(public_path().'/files/myfile.'.$file->getUploadExtension());
            return json(['code' => 0, 'msg' => 'upload success']);
        }
        return json(['code' => 1, 'msg' => 'file not found']);
    }
}

Получение host

Получение информации о хосте запроса.

$request->host();

Если адрес запроса находится на нестандартном порту 80 или 443, информация о хосте может содержать порт, например example.com:8080. Если порт не требуется, в первом параметре можно передать true.

$request->host(true);

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

$request->method();

Возвращаемое значение может быть одним из GET, POST, PUT, DELETE, OPTIONS, HEAD.

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

$request->uri();

Возвращает URI запроса, включая часть path и queryString.

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

$request->path();

Возвращает часть path запроса.

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

$request->queryString();

Возвращает часть queryString запроса.

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

Метод url() возвращает URL без параметров Query.

$request->url();

Возвращает что-то вроде //www.workerman.net/workerman-chat

Метод fullUrl() возвращает URL с параметрами Query.

$request->fullUrl();

Возвращает что-то вроде //www.workerman.net/workerman-chat?type=download

Важно
Методы url() и fullUrl() не возвращают часть протокола (не возвращают http или https).
Поскольку в браузере адреса, начинающиеся с //example.com, автоматически распознают протокол текущего сайта и инициируют запрос по http или https.

Если вы используете прокси nginx, добавьте proxy_set_header X-Forwarded-Proto $scheme; в конфигурацию nginx, смотрите_proxy_nginx,
тогда можно использовать $request->header('x-forwarded-proto');, чтобы определить, является ли это http или https. Например:

echo $request->header('x-forwarded-proto'); // Выводит http или https

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

$request->protocolVersion();

Возвращает строку 1.1 или 1.0.

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

$request->sessionId();

Возвращает строку, состоящую из букв и цифр

Получение IP-адреса клиента запроса

$request->getRemoteIp();

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

$request->getRemotePort();

Получение реального IP-адреса клиента

$request->getRealIp($safe_mode=true);

Когда проект использует прокси (например, nginx), использование $request->getRemoteIp() часто дает IP-адрес прокси-сервера (нр. 127.0.0.1 192.168.x.x), а не реальный IP клиента. В этом случае можно попробовать использовать $request->getRealIp(), чтобы получить реальный IP клиента.

$request->getRealIp() пытается получить реальный IP из HTTP-заголовков x-forwarded-for, x-real-ip, client-ip, x-client-ip, via.

Поскольку HTTP-заголовки легко подделать, результат, полученный с помощью этого метода, не является на 100% надежным, особенно если $safe_mode установлен в false. Более надежным способом получения реального IP клиента через прокси является использование заранее известных безопасных IP-адресов прокси-серверов и четкое знание, какой HTTP-заголовок содержит реальный IP. Если IP, возвращаемый $request->getRemoteIp(), подтвержден как известный безопасный прокси-сервер, тогда можно получить реальный IP через $request->header('HTTP-заголовок, содержащий реальный IP').

Получение IP-адреса сервера

$request->getLocalIp();

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

$request->getLocalPort();

Проверка, является ли запрос ajax

$request->isAjax();

Проверка, является ли запрос pjax

$request->isPjax();

Проверка, ожидался ли ответ в формате json

$request->expectsJson();

Проверка, принимает ли клиент ответ в формате json

$request->acceptJson();

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

Запросы без плагинов возвращают пустую строку ''.

$request->plugin;

Получение имени приложения запроса

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

$request->app;

Поскольку замыкания не принадлежат никакому приложению, запросы от маршрутов замыкания всегда возвращают пустую строку ''
Смотрите раздел маршрутизация

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

Получение имени соответствующего класса контроллера

$request->controller;

Возвращает что-то вроде app\controller\IndexController

Поскольку замыкания не принадлежат никакому контроллеру, запросы от маршрутов замыкания всегда возвращают пустую строку ''
Смотрите раздел маршрутизация

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

Получение имени метода контроллера, соответствующего запросу

$request->action;

Возвращает что-то вроде index

Поскольку замыкания не принадлежат никакому контроллеру, запросы от маршрутов замыкания всегда возвращают пустую строку ''
Смотрите раздел маршрутизация

Переопределение параметров

Иногда нам нужно переопределить параметры запроса, например, отфильтровав запрос, а затем заново присвоить значения объекту запроса, в этом случае мы можем использовать методы setGet(), setPost(), setHeader().

Переопределение GET-параметров

$request->get(); // Предположим, получает ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // В итоге получить ['name' => 'tom']

Важно
Как показано в примере, setGet() переопределяет все GET параметры, setPost() и setHeader() ведут себя аналогично.

Переопределение POST-параметров

$post = $request->post();
foreach ($post as $key => $value) {
    $post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // Получаем отфильтрованные параметры post

Переопределение HEADER-параметров

$request->setHeader(['host' => 'example.com']);
$request->header('host'); // Выводит example.com