我试图通过静态回调验证我的实体。
我能够按照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示例和互联网上发现的其他类似问题,我试图适应我的情况。
答案 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();
}
}
}
基本上,我设置了一个约束,每当一个新用户用户与角色一起注册时,该角色必须是参数中设置的角色。如果没有,则构建违规行为。