Symfony 验证回调

Symfony validation callback

我正在尝试通过静态回调验证我的实体。

我能够在 Symfony guide 之后让它工作,但我不太清楚。

public static function validate($object, ExecutionContextInterface $context, $payload)
{
    // somehow you have an array of "fake names"
    $fakeNames = array(/* ... */);

    // check if the name is actually a fake name
    if (in_array($object->getFirstName(), $fakeNames)) {
        $context->buildViolation('This name sounds totally fake!')
            ->atPath('firstName')
            ->addViolation()
        ;
    }
}

当我填充我的 $fakeNames 数组时它工作正常,但如果我想使它成为 "dynamic" 怎么办?假设我想从参数或数据库或任何地方选择该数组。 从构造函数不起作用并且它必须是静态的那一刻起,我应该如何将东西(例如容器或实体管理器)传递给这个class?

当然,我的方法可能完全错误,但我只是使用 symfony 示例和在互联网上发现的其他一些类似问题,我正在努力适应我的情况。

您可以创建一个约束和验证器并将其注册为服务,这样您就可以注入 entityManager 或任何您需要的东西,您可以在这里阅读更多内容:

https://symfony.com/doc/2.8/validation/custom_constraint.html

或者如果你使用的是 symfony 3.3,它已经是一个服务,你可以在你的构造函数中输入提示: https://symfony.com/doc/current/validation/custom_constraint.html

这是我最终找到的解决方案。 它运行顺利,我希望它可能对其他人有用。

我已经在 validation.yml

上设置了约束
User\UserBundle\Entity\Group:
    constraints:
        - User\UserBundle\Validator\Constraints\Roles\RolesConstraint: ~

这是我的 RolesConstraint class

namespace User\UserBundle\Validator\Constraints\Roles;

use Symfony\Component\Validator\Constraint;

class RolesConstraint extends Constraint
{
    /** @var string $message */
    public $message = 'The role "{{ role }}" is not recognised.';

    public function getTargets()
    {
        return self::CLASS_CONSTRAINT;
    }
}

这是我的 RolesConstraintValidator class

<?php

namespace User\UserBundle\Validator\Constraints\Roles;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class RolesConstraintValidator extends ConstraintValidator
{
    /** @var ContainerInterface */
    private $containerInterface;

    /**
     * @param ContainerInterface $containerInterface
    */
    public function __construct(ContainerInterface $containerInterface)
    {
        $this->containerInterface = $containerInterface;
    }

    /**
     * @param \User\UserBundle\Entity\Group $object
     * @param Constraint $constraint
    */
    public function validate($object, Constraint $constraint)
    {
        if (!in_array($object->getRole(), $this->containerInterface->getParameter('roles'))) {
            $this->context
                ->buildViolation($constraint->message)
                ->setParameter('{{ role }}', $object->getRole())
                ->addViolation();
        }
    }
}

本质上,我设置了一个约束,每次注册新用户用户时,该角色必须在参数中设置的角色中。如果不是,它会构成违规。