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();
}
}
}
本质上,我设置了一个约束,每次注册新用户用户时,该角色必须在参数中设置的角色中。如果不是,它会构成违规。
我正在尝试通过静态回调验证我的实体。
我能够在 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();
}
}
}
本质上,我设置了一个约束,每次注册新用户用户时,该角色必须在参数中设置的角色中。如果不是,它会构成违规。