kununu/controller-validation-bundle

此包的最新版本(1.0.0)没有提供许可信息。

使用Symfony验证器通过注解验证控制器请求

1.0.0 2019-06-18 11:43 UTC

README

此包引入了@Validator注解,允许使用Symfony验证器约束和注解来验证请求数据。通常Symfony在实体中定义断言,使用此库,我们只需对请求数据使用集合约束,它将自动捕获它,多亏了@Validator注解。

安装

步骤1:安装包

composer require kununu/controller-validation-bundle:dev-master

步骤2:启用包

// config/bundles.php

return [
    // ...
    Kununu\ControllerValidationBundle\KununuControllerValidationBundle::class => ['all' => true],
];

配置

约束命名空间

您需要定义约束所在的命名空间

# config/packages/kununu_controller_validation.yml
kununu_controller_validation:
    constraints_namespace: App\Validator\Constraints

自定义验证异常

您可以根据需要定义自己的异常。否则将使用默认的ValidationException

# app/config/config.yml
kununu_controller_validation:
    validation_exception:
        class: App\Exception\ValidationException
        message: Validation error
        code: 400

监听器优先级

ControllerValidatorListener默认以优先级0注册。在某些情况下,需要更早或更晚地触发事件。这就是为什么添加了listener_priority配置选项。

优先级越高,事件触发越早。

# app/config/config.yml
kununu_controller_validation:
    listener_priority: 1

⚠️警告: ⚠️ 如果您使用@ParamConvert注解,并且使用任何自定义ParamConverters,请不要将优先级更改为小于0。该注解将在paramConverter调用后尝试验证请求,如果请求无效,实际转换可能会失败。如果绝对必要,请确保在执行其他任何操作之前,在您的自定义转换器中手动验证数据。

注意:您可以使用控制台命令获取所有已注册事件的列表:bin/console debug:event-dispatcher

用法

约束

<?php
// src/Bundle/Validator/Constraints/ExampleConstraints.php
namespace App\Validator\Constraints;

use Symfony\Component\Validator\Constraints;
use Symfony\Component\Validator\Constraints\CollectionValidator;

class ExampleConstraints extends Constraints\Collection
{
    public function __construct()
    {
        parent::__construct([
            'id'          => [
                new Constraints\NotBlank(),
            ],
            'name'        => new Constraints\NotBlank(),
            'example_id'  => [
                new Constraints\NotBlank(),
                new Constraints\Range(['min' => 0,'max' => 42]),
            ],
        ]);
    }

    public function validatedBy()
    {
        return CollectionValidator::class;
    }
}

控制器

<?php
// src/App/Controller/ExampleController.php
namespace App\Controller\ExampleController;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Kununu\ControllerValidationBundle\Annotation\Validator;

class ExampleController extends Controller
{
    /**
     * @param Request $request
     *
     * @Validator("ExampleConstraints")
     */
    public function exampleAction(Request $request)
    {
        // ...
    }
}