yiisoft / request-model
Yii Framework Request Model
Fund package maintenance!
Open Collective
yiisoft
Installs: 40 609
Dependents: 2
Suggesters: 0
Security: 0
Stars: 14
Watchers: 15
Forks: 8
Open Issues: 8
Requires
- php: ^8.0
- psr/container: ^1.0|^2.0
- psr/http-message: ^1.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
- yiisoft/arrays: ^2.0|^3.0
- yiisoft/injector: ^1.0
- yiisoft/middleware-dispatcher: ^5.0
- yiisoft/router: ^3.0
- yiisoft/validator: ^1.0
Requires (Dev)
- maglnet/composer-require-checker: ^4.2
- nyholm/psr7: ^1.4
- phpunit/phpunit: ^9.5
- rector/rector: ^0.18.0
- roave/infection-static-analysis-plugin: ^1.16
- spatie/phpunit-watcher: ^1.23
- vimeo/psalm: ^4.30|^5.7
- yiisoft/dummy-provider: ^1.0
- yiisoft/http: ^1.2
- yiisoft/test-support: ^3.0
- yiisoft/translator: ^3.0
This package is auto-updated.
Last update: 2023-10-10 13:08:17 UTC
README
This package is deprecated. Use Yii Input HTTP instead.
❌
Yii Request Model
Request model simplifies working with request data. It allows you to decorate data for easy retrieval and automatically validate it when needed.
Requirements
- PHP 8.0 or higher.
Installation
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.
General usage
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');
Attributes
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 |
Unit testing
The package is tested with PHPUnit. To run tests:
./vendor/bin/phpunit
Mutation testing
The package tests are checked with Infection mutation framework. To run it:
./vendor/bin/infection
Static analysis
The code is statically analyzed with Psalm. To run static analysis:
./vendor/bin/psalm
Support the project
Follow updates
License
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.