madesimple / slim-validation
Abstract Slim middleware to allow request simple validation
Installs: 1 000
Dependents: 0
Suggesters: 0
Security: 0
Stars: 3
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/madesimple/slim-validation
Requires
- php: >=7.2
- madesimple/php-form-validator: ^2
- slim/slim: ^4
Requires (Dev)
- php-di/slim-bridge: ^3.0
- phpunit/phpunit: ^8
- psr/container: ^1.0
- slim/psr7: ^1.1
README
Slim Validation is an abstract class to be extended to perform per route validation. Slim Validation allows two types of validation models:
- Validation as a function
- Validation as a middleware
Validation as a function is the recommended use case.
Since Slim v4 has become more flexible there is no longer a straight forward method for extracting the request arguments
as a middleware; this means that getPathRules checks are no longer supported by the validation as a middleware.
In both cases simply extend the abstract class \MadeSimple\Slim\Middleware\Validation and implement the three abstract methods:
- getPathRules- allows you to validate the request path.
- getQueryParameterRules- allows you to validate the query parameters of the request.
- getParsedBodyRules- allows you to validate the parsed body of the request.
Slim Validation considers requests which violate the path rules as 404 Not Found. Requests which violate either query
parameter or parsed body rules should return as 422 Unprocessable Entity.
For example:
<?php // Request class namespace Requests; class ModelRequestValidation extends \MadeSimple\Slim\Middleware\Validation { /** * @return array Rule set for the request path. */ protected function getPathRules(): array { return [ // The model locator must be a uuid and pass your custom acl check 'locator' => 'uuid|custom_acl_check' ]; } protected function getQueryParameterRules(array $routeArguments): array { return []; } protected function getParsedBodyRules(array $routeArguments): array { return []; } } class PaginatedRequestValidation extends \MadeSimple\Slim\Middleware\Validation { protected function getPathRules(): array { return []; } /** * @param array $routeArguments Route arguments * * @return array Rule set for the query parameters. */ protected function getQueryParameterRules(array $routeArguments): array { return [ // The page must be at least 1 'page' => 'is:int|min:1', // The items per page must at least 5 but no more than 100 'limit' => 'is:int|min:5|max:100', ]; } /** * @param array $routeArguments Route arguments * * @return array Rule set for the parsed body. */ protected function getParsedBodyRules(array $routeArguments): array { return []; } } class PostRequestValidation extends \MadeSimple\Slim\Middleware\Validation { protected function getPathRules(): array { return []; } protected function getQueryParameterRules(array $routeArguments): array { return []; } /** * @param array $routeArguments Route arguments * * @return array Rule set for the parsed body. */ protected function getParsedBodyRules(array $routeArguments): array { return [ // The current password is required 'current_password' => 'required', // The updated password is required and must meet your custom password strength test 'updated_password' => 'required|custom_password_strength_test', // The confirm password is required and must equal the `updated_password` property 'confirm_password' => 'required|equals:updated_password', ]; } }
Validation as a function
Validation as a function is the recommended method.
If the request fails path rules validation then a Slim\Exception\HttpNotFoundException is thrown.
If the request fails query parameter or parsed body validation then a MadeSimple\Slim\Middleware\InvalidRequestException is thrown.
To use validation as a function you create the validation class as above and call the validate method in the route's callable, for example:
<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; //... $app = new \Slim\App; //... $app->post('/route/path/foo', function (Request $request, Response $response) { // Validate the request immediately, if it is invalid then it will throw an exception (new \Request\FooPostValidation($this))->validate($request); // ... });
Validation as a middleware
To use validation as a middleware you create the validation class as above and add it as a middleware for the routes you wish to apply that validation to, for example:
<?php // Routes $app->post('/route/path/foo', \Controller\Foo::class . ':post') ->add(\Request\FooPostValidation::class);
If the request fails validation of either query parameters or parsed body rules then check the container for an invalidRequestHandler otherwise throw MadeSimple\Slim\Middleware\InvalidRequestException. If there is a handler then invalidRequestHandler($request, $response, $errors) is called.
Official Documentation
- Simple Validator: https://github.com/pdscopes/php-form-validator
- Slim Framework: https://www.slimframework.com/