gepur-it/request-converter-bundle

symfony 的请求转换器

5.0.1 2019-12-05 12:44 UTC

This package is auto-updated.

Last update: 2024-09-05 23:30:14 UTC


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"]