This package is deprecated. Use Yii Input HTTP instead.
❌
Request model simplifies working with request data. It allows you to decorate data for easy retrieval and automatically validate it when needed.
- PHP 8.0 or higher.
The package could be installed with composer:
composer require yiisoft/request-model
According to yiisoft/middleware-dispatcher
docs, you need to set
the implementation of ParametersResolverInterface
to HandlerParametersResolver
via container or pass directly.
A simple version of the request model looks like the following:
use Yiisoft\RequestModel\RequestModel;
use Yiisoft\Validator\RulesProviderInterface;
use Yiisoft\Validator\Rule\Email;
use Yiisoft\Validator\Rule\Required;
final class AuthRequest extends RequestModel implements RulesProviderInterface
{
public function getLogin(): string
{
return (string)$this->getAttributeValue('body.login');
}
public function getPassword(): string
{
return (string)$this->getAttributeValue('body.password');
}
public function getRules(): array
{
return [
'body.login' => [
new Required(),
new Email(),
],
'body.password' => [
new Required(),
]
];
}
}
Route:
Route::post('/test')
->action([SimpleController::class, 'action'])
->name('site/test')
Usage in controller:
use Psr\Http\Message\ResponseInterface;
final class SimpleController
{
public function action(AuthRequest $request): ResponseInterface
{
echo $request->getLogin();
...
}
}
If the data does not pass validation, RequestValidationException
will be thrown.
If you need to handle an exception and, for example, send a response, you can intercept its middleware.
For example:
final class ExceptionMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
try {
return $handler->handle($request);
} catch (RequestValidationException $e) {
return new Response(400, [], $e->getFirstError());
}
}
}
You can use the request model without validation. To do this, you need to remove the ValidatableModelInterface
.
In this case, the data will be included into the model, but will not be validated. For example:
final class ViewPostRequest extends RequestModel
{
public function getId(): int
{
return (int)$this->getAttributeValue('router.id');
}
}
Inside the request model class, data is available using the following keys:
key | source |
---|---|
query | $request->getQueryParams() |
body | $request->getParsedBody() |
attributes | $request->getAttributes() |
headers | $request->getHeaders() |
files | $request->getUploadedFiles() |
cookie | $request->getCookieParams() |
router | $currentRoute->getArguments() |
This data can be obtained as follows
$this->requestData['router']['id'];
or through the methods
$this->hasAttribute('body.user_id');
$this->getAttributeValue('body.user_id');
You can use attributes in an action handler to get data from a request:
use Psr\Http\Message\ResponseInterface;
use Yiisoft\RequestModel\Attribute\Request;
use Yiisoft\RequestModel\Attribute\Route;
final class SimpleController
{
public function action(#[Route('id')] int $id, #[Request('foo')] $attribute,): ResponseInterface
{
echo $id;
//...
}
}
Attributes are also supported in closure actions.
There are several attributes out of the box:
Name | Source |
---|---|
Body | Parsed body of request |
Query | Query parameter of URI |
Request | Attribute of request |
Route | Argument of current route |
UploadedFiles | Uploaded files of request |
The package is tested with PHPUnit. To run tests:
./vendor/bin/phpunit
The package tests are checked with Infection mutation framework. To run it:
./vendor/bin/infection
The code is statically analyzed with Psalm. To run static analysis:
./vendor/bin/psalm
The Yii Request Model is free software. It is released under the terms of the BSD License.
Please see LICENSE
for more information.
Maintained by Yii Software.