Вашим маршрутам Slone и промежуточному программному обеспечению предоставляется объект запроса PSR 7, который представляет текущий HTTP-запрос, полученный вашим веб-сервером. Объект запроса реализует PSR 7 ServerRequestInterface с помощью которого вы можете проверять и обрабатывать метод HTTP-запросов, заголовки и тело.
Объект запроса PSR 7 вводится в ваши маршруты Slim-приложений в качестве первого аргумента для обратного вызова маршрута следующим образом:
<?php
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
$app = new \Slim\App;
$app->get('/foo', function (ServerRequestInterface $request, ResponseInterface $response) {
// Use the PSR 7 $request object
return $response;
});
$app->run();
Объект запроса PSR 7 вводится в ваше middleware Slim-приложения в качестве первого аргумента промежуточного программного обеспечения, вызываемого следующим образом:
<?php
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
$app = new \Slim\App;
$app->add(function (ServerRequestInterface $request, ResponseInterface $response, callable $next) {
// Use the PSR 7 $request object
return $next($request, $response);
});
// Define app routes...
$app->run();
Каждый HTTP-запрос имеет метод, который обычно является одним из следующих:
Вы можете проверить метод HTTP-запроса с соответствующим методом имени объекта Request getMethod()
.
$method = $request->getMethod();
Поскольку это обычная задача, встроенная реализация PSR 7 Slim также предоставляет эти запатентованные методы, которые возвращают
true
или false
.
$request->isGet()
$request->isPost()
$request->isPut()
$request->isDelete()
$request->isHead()
$request->isPatch()
$request->isOptions()
Это возможно подменить или переопределить метод HTTP запроса. Это полезно, если например, вам нужно подражать PUT
запросу, используя традиционный веб-браузер, который поддерживает GET
или POST
запроса.
Существует два способа переопределить метод HTTP-запроса. Вы можете включить
_METHOD
параметр в POST
тело запроса. HTTP-запрос должен использовать
application/x-www-form-urlencoded
тип содержимого.
POST /path HTTP/1.1
Host: example.com
Content-type: application/x-www-form-urlencoded
Content-length: 22
data=value&_METHOD=PUT
Вы также можете переопределить метод HTTP-запроса с помощью настраиваемого
X-Http-Method-Override
заголовка HTTP-запроса. Это работает с любым типом содержимого HTTP-запроса.
POST /path HTTP/1.1
Host: example.com
Content-type: application/json
Content-length: 16
X-Http-Method-Override: PUT
{"data":"value"}
Вы можете получить оригинальный (не переопределенный) HTTP метод с помощью метода объекта запроса PSR 7 getOriginalMethod()
.
Каждый HTTP-запрос имеет URI, который идентифицирует запрашиваемый ресурс приложения. URI запроса HTTP имеет несколько частей:
http
or https
)example.com
)80
or 443
)/users/1
)sort=created&dir=asc
)Вы можете получить объект URI объекта запроса PSR 7 с помощью его getUri()
метода:
$uri = $request->getUri();
URI объекта запроса PSR 7 сам по себе является объектом, который предоставляет следующие методы для проверки URL-адресов URL-адреса HTTP-запроса:
getScheme()
getAuthority()
getUserInfo()
getHost()
getPort()
getPath()
getBasePath()
getQuery()
(возвращает полную строку запроса, например a=1&b=2
)getFragment()
getBaseUrl()
Вы можете получить параметры запроса как ассоциативный массив при использовании объекта Request getQueryParams()
.
Вы также можете получить одно значение параметра запроса, с необязательным значением по умолчанию, если параметр отсутствует, используя getQueryParam($key, $default = null)
.
getBasePath()
метода объекта Uri . Это будет пустая строка, если приложение Slim установлено в самый верхний каталог корневого каталога документа.
Каждый HTTP-запрос имеет заголовки. Это метаданные, которые описывают HTTP-запрос, но не отображаются в теле запроса. Объект запроса PSR 7 Slim предоставляет несколько методов для проверки своих заголовков.
Вы можете получить все заголовки HTTP-запросов в качестве ассоциативного массива с помощью getHeaders()
метода объекта запроса PSR 7 . Результирующие ключи ассоциативного массива - это имена заголовков, и его значения сами представляют собой числовой массив строковых значений для их соответствующего заголовка.
$headers = $request->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
Вы можете получить значения одного заголовка с помощью getHeader($name)
метода объекта PSR 7 Request. Это возвращает массив значений для данного заголовка. Помните, что один HTTP-заголовок может иметь более одного значения!
$headerValueArray = $request->getHeader('Accept');
Вы также можете получить строку, разделенную запятыми, со всеми значениями для данного заголовка с помощью getHeaderLine($name)
метода объекта запроса PSR 7 . В отличие от getHeader($name)
метода, этот метод возвращает строку, разделенную запятыми.
$headerValueString = $request->getHeaderLine('Accept');
Вы можете проверить наличие заголовка с помощью hasHeader($name)
метода объекта PSR 7 Request .
if ($request->hasHeader('Accept')) {
// Do something
}
Каждый запрос HTTP имеет тело. Если вы создаете приложение Slim, которое использует данные JSON или XML, вы можете использовать
getParsedBody()
метод объекта PSR 7 Request для анализа тела запроса HTTP в собственный PHP-формат. Slim может анализировать данные JSON, XML и URL-кодированные данные.
$parsedBody = $request->getParsedBody();
json_decode($input, true)
.SimpleXMLElement
с simplexml_load_string($input)
.parse_str($input)
.Для URL-кодированных запросов вы также можете получить одно значение параметра, с необязательным значением по умолчанию, если параметр отсутствует, используя getParsedBodyParam($key, $default = null)
.
Технически говоря, объект запроса PSR 7 Slim представляет собой тело запроса HTTP как экземпляр \Psr\Http\Message\StreamInterface
. Вы можете получить StreamInterface
экземпляр тела запроса HTTP с помощью getBody()
метода объекта запроса PSR 7. getBody()
Способ является предпочтительным , если размер входящего запроса HTTP , неизвестен или слишком большой для доступной памяти.
$body = $request->getBody();
Получаемый \Psr\Http\Message\StreamInterface
экземпляр предоставляет следующие методы для чтения и повторения его базового PHP resource
.
getSize()
tell()
eof()
isSeekable()
seek()
rewind()
isWritable()
write($string)
isReadable()
read($length)
getContents()
getMetadata($key = null)
При вызове getParsedBody
объекта Request несколько раз тело обрабатывается только один раз, даже если тело запроса изменяется в то же время.
Чтобы обеспечить репарацию тела, reparseBody
можно использовать метод объекта Request.
Загрузка файлов $_FILES
доступна из getUploadedFiles()
метода объекта Request . Это возвращает массив с именем элемента.
$files = $request->getUploadedFiles();
Каждый объект в $files
массиве является экземпляром
\Psr\Http\Message\UploadedFileInterface
и поддерживает следующие методы:
getStream()
moveTo($targetPath)
getSize()
getError()
getClientFilename()
getClientMediaType()
См. cookbook о том, как загружать файлы с помощью формы POST.
Реализация Slim's PSR 7 Request предоставляет эти дополнительные проприетарные методы, которые помогут вам дополнительно проверить HTTP-запрос.
Вы можете обнаружить запросы XHR с помощью isXhr()
метода объекта Request. Этот метод обнаруживает наличие X-Requested-With
заголовка HTTP-запроса и обеспечивает его значение XMLHttpRequest
.
POST /path HTTP/1.1
Host: example.com
Content-type: application/x-www-form-urlencoded
Content-length: 7
X-Requested-With: XMLHttpRequest
foo=bar
if ($request->isXhr()) {
// Do something
}
Вы можете получить тип содержимого HTTP-запроса с помощью getContentType()
метода объекта Request . Это возвращает Content-Type
полное значение заголовка, предоставленное клиентом HTTP.
$contentType = $request->getContentType();
Возможно, вам не нужен полный Content-Type
заголовок. Что, если вместо этого вам нужен только тип мультимедиа? Вы можете получить тип медиафайла HTTP-запроса с помощью getMediaType()
метода объекта Request .
$mediaType = $request->getMediaType();
Вы можете получить добавленные параметры типа носителя в качестве ассоциативного массива с помощью getMediaTypeParams()
метода объекта Request.
$mediaParams = $request->getMediaTypeParams();
Одним из наиболее распространенных параметров типа мультимедиа является набор символов HTTP-запроса. Объект Request предоставляет выделенный метод для получения этого параметра типа носителя.
$charset = $request->getContentCharset();
Вы можете получить длину содержимого запроса HTTP с помощью getContentLength()
метода объекта Request.
$length = $request->getContentLength();
Для извлечения одного значения параметра запроса, использовать методы: getParam()
, getQueryParam()
, getParsedBodyParam()
, getCookieParam()
, getServerParam()
, аналоги формы множественного числа PSR-7 get*Params() методы.
Например, чтобы получить один параметр сервера:
$foo = $request->getServerParam('HTTP_NOT_EXIST', 'default_value_here');
Иногда в промежуточном программном обеспечении вам требуется параметр вашего маршрута.
В этом примере мы сначала проверяем, что пользователь вошел в систему, а во-вторых, у пользователя есть разрешения на просмотр конкретного видео, которое они пытаются просмотреть.
$app->get('/course/{id}', Video::class.":watch")->add(Permission::class)->add(Auth::class);
//.. In the Permission Class's Invoke
/** @var $route \Slim\Route */
$route = $request->getAttribute('route');
$courseId = $route->getArgument('id');
Slim выглядит как тип медиа-запроса и, если он его распознает, будет анализировать его на структурированные данные, доступные через $request->getParsedBody()
. Обычно это массив, но является объектом для типов media XML.
Следующие типы носителей распознаются и анализируются:
Если вы хотите, чтобы Slim анализировал контент с другого media type, вам нужно либо самостоятельно разобрать исходный media, либо зарегистрировать новый парсер. Парсеры media - это просто вызывающие элементы, которые принимают $input
строку и возвращают анализируемый объект или массив.
Зарегистрируйте новый медиасервер в промежуточном программном приложении или маршруте. Обратите внимание, что вы должны зарегистрировать парсер, прежде чем пытаться получить доступ к анализируемому телу в первый раз.
Например, для автоматического разбора JSON, который отправляется с text/javascript
типом контента, вы регистрируете парсер типа медиа в промежуточном программном обеспечении следующим образом:
// Add the middleware
$app->add(function ($request, $response, $next) {
// add media parser
$request->registerMediaTypeParser(
"text/javascript",
function ($input) {
return json_decode($input, true);
}
);
return $next($request, $response);
});
С помощью PSR-7 можно добавлять объекты / значения в объект запроса для дальнейшей обработки. В ваших приложениях промежуточное программное обеспечение часто должно передавать информацию до вашего закрытия маршрута и способ сделать это заключается в том, чтобы добавить его в объект запроса через атрибут.
Пример. Установка значения для объекта запроса.
$app->add(function ($request, $response, $next) {
$request = $request->withAttribute('session', $_SESSION); //add the session storage to your request as [READ-ONLY]
return $next($request, $response);
});
Пример, как получить значение.
$app->get('/test', function ($request, $response, $args) {
$session = $request->getAttribute('session'); //get the session from the request
return $response->write('Yay, ' . $session['name']);
});
Объект запроса также имеет объемные функции. $request->getAttributes()
и $request->withAttributes()