This is a small library that helps you validate incoming requests with the symfony validation component. knowing how to work with the validation component is a must, Validation doc
Make sure Composer is installed globally, as explained in the installation chapter of the Composer documentation.
Open a command console, enter your project directory and execute:
$ composer require choz/request-validation-bundle
Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle:
$ composer require choz/request-validation-bundle
Then, enable the bundle by adding it to the list of registered bundles
in the config/bundles.php
file of your project:
// config/bundles.php
return [
// ...
Choz\RequestValidationBundle\ChozRequestValidationBundle::class => ['all' => true],
];
Request:
<?php
declare(strict_types=1);
namespace App\Request;
use Choz\RequestValidationBundle\Request\BaseRequest;
use Symfony\Component\Validator\Constraints\Collection;
use Symfony\Component\Validator\Constraints\Required;
use Symfony\Component\Validator\Constraints\Type;
class TagCreateRequest extends BaseRequest
{
protected function rules(): array
{
return [
new Collection([
'id' => [new Required(), new Type('int')],
'name' => [new Required(), new Type('string')],
]),
];
}
}
Controller:
<?php
namespace App\Controller;
use App\Request\TagCreateRequest;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
class TagCreateController extends AbstractController
{
#[Route('/tags', methods: ['POST'])]
public function __invoke(TagCreateRequest $request): JsonResponse {
$id = $request->getInteger('id');
$name = $request->getString('name');
// use your values
return new JsonResponse(['id' => $id, 'name' => $name], status: JsonResponse::HTTP_CREATED);
}
}
Response with errors from an empty request (code 400):
{
"message": "The given data failed to pass validation.",
"errors": {
"id": [
"This field is missing."
],
"name": [
"This field is missing."
]
}
}
To use it correctly with json request is recommended to install: Symfony JsonRequest Bundle
JSON Request:
{
"id": "1234",
"name": 123
}
Will get a JSON Response:
{
"message": "The given data failed to pass validation.",
"errors": {
"id": [
"This value should be of type int."
],
"name": [
"This value should be of type string."
]
}
}
Request:
<?php
declare(strict_types=1);
namespace App\Request;
use Choz\RequestValidationBundle\Request\BaseRequest;
use Symfony\Component\Validator\Constraints\Collection;
use Symfony\Component\Validator\Constraints\Required;
use Symfony\Component\Validator\Constraints\Type;
class TagCreateRequest extends BaseRequest
{
protected function rules(): array
{
return [
new Collection([
'id' => [new Required(), new Type('int')],
'name' => [new Required(), new Type('string')],
]),
];
}
public function getId(): int {
// return $this->request()->getInt('id'); this works too.
return $this->getInteger('id');
}
public function getName(): string {
// return $this->request()->getAlpha('name'); this works too.
return $this->getString('name');
}
}
Controller:
<?php
namespace App\Controller;
use App\Request\TagCreateRequest;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
class TagCreateController extends AbstractController
{
#[Route('/tags', methods: ['POST'])]
public function __invoke(TagCreateRequest $request): JsonResponse {
$id = $request->getId();
$name = $request->getName();
// use your values
return new JsonResponse(['id' => $id, 'name' => $name], status: JsonResponse::HTTP_CREATED);
}
}
Override response code:
# config/packages/choz_request_validation.yaml
choz_request_validation:
response_code: !php/const Symfony\Component\HttpFoundation\Response::HTTP_UNPROCESSABLE_ENTITY # 422
Override event listener:
# config/services.yaml
services:
# ... other services
choz_request_validation_listener:
class: App\EventListener\CustomRequestValidationEventListener
tags:
- { name: kernel.event_listener, event: kernel.exception }