如何在自定义控件中验证数据

时间:2019-01-19 10:03:47

标签: symfony api-platform.com

我创建了一个带有自定义控制器的实体:

// api/src/Entity/UserRegistration.php


namespace App\Entity;

use ...

/**
 * UserRegistraion Data
 *
 * @ApiResource(collectionOperations={},itemOperations={"post"={
 *         "method"="POST",
 *         "path"="/register",
 *         "controller"=CreateUser::class}})
 *
 */
class UserRegistration
{
     .....
    /**
     * @var string The E-mail
     *
     * @Assert\NotBlank
     * @Assert\Email(
     *     message = "The email '{{ value }}' is not a valid email.",
     *     checkMX = true
     * )
     */
    public $email;
     .....

还有一个自定义控制器:

// api/src/Controller/CreateUser.php


class CreateUser
{

     .....
    public function __invoke(UserRegistration $data): UserRegistration
    {


        return $data;
    }
}

当我用错误的数据(例如错误的电子邮件地址)呼叫控制器时,我会期望验证错误,但未选中该错误。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

最常见的方法是使用提供验证的表单,或者仅将Validator作为独立组件。在您的情况下-由于您正在使用ApiPlatform-后者将是更好的选择,因为您不需要将表单呈现回用户,而是返回错误响应。

首先,您需要将Validator注入您的Controller中:

use ApiPlatform\Core\Bridge\Symfony\Validator\Exception\ValidationException;
use Symfony\Component\Validator\Validator\ValidatorInterface;

class CreateUser
{
    private $validator;

    public function __construct(ValidatorInterface $validator)
    {
        $this->validator = $validator;
    }

    public function __invoke(UserRegistration $data): UserRegistration
    {
        $errors = $this->validator->validate($data);
        if (count($errors) > 0) {
            throw new ValidationException($errors);
        }

        return $data;
    } 
}

您还可以通过查看ValidateListener来检查ApiPlatform的工作方式。它提供了一些附加功能,例如对于验证组,您现在似乎不需要,但是以后可能会很有趣。然后,ApiPlatform将使用其ValidationExceptionListener对您抛出的异常做出反应并适当地呈现它。