gepur-it / request-converter-bundle
symfony 的请求转换器
5.0.1
2019-12-05 12:44 UTC
Requires
- php: >=7.3
- ext-json: *
- doctrine/annotations: >=1.6
- symfony/config: ^5.0
- symfony/console: ^5.0
- symfony/dependency-injection: ^5.0
- symfony/http-kernel: ^5.0
- symfony/property-access: ^5.0
- symfony/validator: ^5.0
Requires (Dev)
- phpunit/phpunit: >=7.2
Conflicts
README
#请求转换和验证包#
[目录]
关于
此包允许轻松地将传入的请求映射到定义的DTO,并在控制器开始工作之前对其进行验证
文档
安装
要安装转换器,请使用composer
$ composer require request-converter-bundle
如何使用
首先,创建自己的请求DTO模型并添加验证规则
请求模型
<?php namespace App\RequestModel; use Symfony\Component\Validator\Constraints as Assert; /** * Class MyRequestModel * @package App\RequestModel */ class MyRequestModel { /** * @Assert\Type(type="integer") * @Assert\NotNull() * @Assert\GreaterThan(value="0") */ public $firstNumber; // yes, you can use default values /** * @Assert\Type(type="integer") * @Assert\NotNull() * @Assert\GreaterThanOrEqual(value="-1") */ public $secondNumber = 0; }
然后,在控制器中使用@RequestDTO注解声明模型
控制器
<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Response; use GepurIt\RequestConverterBundle\Annotations\RequestDTO; use Symfony\Component\HttpFoundation\Response; use App\RequestModel\MyRequestModel; /** * Class MyController * @package App\Controller */ class MyController extends AbstractController { /** * @Route("/my_path", name="my_route") * @return Response * @RequestDTO("App\RequestModel\MyRequestModel") */ public function myAction(MyRequestModel $requestModel) { // here you can work with object $requestModel. doSomething($requestModel->firstNumber); ... } }
更改函数参数名称
默认情况下,requestModel参数名称为'requestModel',您可以更改它,在注解中定义'name'参数
... /** * @Route("/my_path", name="my_route") * @return Response * @RequestDTO(model="App\RequestModel\MyRequestModel", name="myName") */ public function myAction(MyRequestModel $myName) { // here you can work with object $myName. doSomething($myName->firstNumber); ... } ...
禁用验证
要禁用请求验证,将"validate"注解参数设置为false
... /** * @Route("/my_path", name="my_route") * @return Response * @RequestDTO(model="App\RequestModel\MyRequestModel", validate=false) */ public function myAction(MyRequestModel $myName) { // here you can work with object $myName. doSomething($myName->firstNumber); ... } ...
注解参数
- model - 包含请求模型类名的类,必需
- name - 包含控制器方法参数的名称,默认为"requestModel"
- validate - 是否在执行动作之前对请求进行验证。默认为false。
构造后处理
您可以在请求构造后计算一些额外的参数进行验证。
示例:请求有两个整数参数,但您需要验证自定义规则 - 这两个参数之和不应大于10。
接口实现
首先,在请求模型中实现"GepurIt\RequestConverterBundle\Contract\RequestModelServiceInterface"接口
<?php namespace App\RequestModel; use Symfony\Component\Validator\Constraints as Assert; use GepurIt\RequestConverterBundle\Contract\RequestModelServiceInterface; /** * Class MyRequestModel * @package App\RequestModel */ class MyRequestModel implements RequestModelServiceInterface { /** * @Assert\Type(type="integer") * @Assert\NotNull() * @Assert\GreaterThan(value="0") */ public $firstNumber; // yes, you can use default values /** * @Assert\Type(type="integer") * @Assert\NotNull() * @Assert\GreaterThanOrEqual(value="-1") */ public $secondNumber = 0; /** * {@inheritDoc} **/ public function handle() { //calculate here } }
自定义字段处理
如您所见,RequestModelServiceInterface提供了"handle"方法。此方法将在请求模型构造后立即被调用。因此,您可以在"handle()"方法中添加自定义字段及其验证规则
<?php ... class MyRequestModel implements RequestModelServiceInterface { ... /** * @Assert\LessThanOrEqual(value="10") */ public $sum = 0; /** * {@inheritDoc} **/ public function handle() { $this->sum = $this->firstNumber + $this->secondNumber; } }
依赖注入
要使用依赖注入在请求中,请三思而后行
如果您仍然需要依赖注入,请再三思考,也许您只需要一个自定义验证?
但如果您确信,您确实需要在请求模型中需要依赖项,则可以将其定义为容器服务
⚠️ 警告:不要在此处使用任何领域逻辑或业务,只用于验证
- 请求模型服务必须实现RequestModelServiceInterface
- 要在转换器中注册此服务,请使用'tag'标记为'request_model_service'
实现接口和依赖项
<?php ... class MyRequestModel implements RequestModelServiceInterface { /** @var MyCalculator $calculator */ private $calculator; ... public function __construct(MyCalculator $calculator) { $this->calculator = $calculator; } /** * @Assert\LessThanOrEqual(value="10") */ public $sum = 0; /** * {@inheritDoc} **/ public function handle() { $this->sum = $this->calculator->sum($this->firstNumber, $this->secondNumber); } }
在转换器中注册此服务
services: App\RequestModel\MyRequestModel: autowire: true tags: ["request_model_service"]