Symfony验证回调

时间:2017-09-13 18:08:24

标签: symfony orm symfony-3.3 symfony-validator symfony3.x

我试图通过静态回调验证我的实体。

我能够按照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数组时它工作正常,但如果我想做它"动态"?让我们说我想从参数或数据库或任何地方选择该数组。 从构造函数不工作的那一刻开始,我应该如何将东西(例如容器或实体管理器)传递给这个类?它必须是静态的?

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

2 个答案:

答案 0 :(得分:3)

您可以创建一个Constraint和Validator并将其注册为服务,以便您可以注入entityManager或任何您需要的东西,您可以在这里阅读更多内容:

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

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

答案 1 :(得分:1)

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

我已在validation.yml

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

这是我的RolesConstraint类

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类

<?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();
        }
    }
}

基本上,我设置了一个约束,每当一个新用户用户与角色一起注册时,该角色必须是参数中设置的角色。如果没有,则构建违规行为。