choz / request-validation-bundle
受 Laravel 请求验证启发的包
v1.0.7
2024-04-02 10:59 UTC
Requires
- php: >=7.4 || ^8.0
- adbario/php-dot-notation: ^3.0
- symfony/framework-bundle: ^4.3 || ^5.0 || ^6.0
- symfony/property-access: ^4.3 || ^5.0 || ^6.0
- symfony/validator: ^4.3 || ^5.0 || ^6.0
Requires (Dev)
- phpstan/phpstan: 1.9.1
- phpunit/phpunit: ^9.5
README
这是一个小型库,可以帮助您使用 symfony 验证组件验证传入的请求。了解如何使用验证组件是必须的,请参阅验证文档
安装
请确保已经全局安装了 Composer,具体操作请参考 Composer 文档中的安装章节。
使用 Symfony Flex 的应用程序
打开命令行,进入您的项目目录,并执行以下命令
$ composer require choz/request-validation-bundle
不使用 Symfony Flex 的应用程序
步骤 1: 下载包
打开命令行,进入您的项目目录,然后执行以下命令以下载此包的最新稳定版本
$ composer require choz/request-validation-bundle
步骤 2: 启用包
然后,通过将其添加到项目中 config/bundles.php
文件中注册的包列表来启用此包
// config/bundles.php return [ // ... Choz\RequestValidationBundle\ChozRequestValidationBundle::class => ['all' => true], ];
基本用法
请求
<?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')], ]), ]; } }
控制器
<?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); } }
空请求的错误响应(代码 400)
{ "message": "The given data failed to pass validation.", "errors": { "id": [ "This field is missing." ], "name": [ "This field is missing." ] } }
可选
为了正确地与 JSON 请求一起使用,建议安装: Symfony JsonRequest Bundle
JSON 请求
{ "id": "1234", "name": 123 }
将获得 JSON 响应
{ "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." ] } }
高级(推荐)用法
请求
<?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'); } }
控制器
<?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); } }
自定义响应代码
覆盖响应代码
# config/packages/choz_request_validation.yaml choz_request_validation: response_code: !php/const Symfony\Component\HttpFoundation\Response::HTTP_UNPROCESSABLE_ENTITY # 422
自定义事件监听器
覆盖事件监听器
# config/services.yaml services: # ... other services choz_request_validation_listener: class: App\EventListener\CustomRequestValidationEventListener tags: - { name: kernel.event_listener, event: kernel.exception }