【问题标题】:Symfony2 Custom Validator with EntityManager not working带有EntityManager的Symfony2自定义验证器不起作用
【发布时间】:2016-01-13 02:46:13
【问题描述】:

我正在尝试构建一个验证器来检查数据库中的某些值。为此,我需要在服务中注入 entityManager 并为我的 Validation 方法提供别名,如 Symfony 官方文档中所述。

问题是,在按书完成所有操作后,我仍然收到一条错误消息,提示 entityManager 为空:

可捕获的致命错误:传递给 XXX\CommonBundle\Validator\Constraints\IsSingleEntryValidator::__construct() 的参数 1 必须是 Doctrine\ORM\EntityManager 的实例,没有给出,在 /var/www/XXX/vendor/ 中调用symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php 在第 71 行并定义

我的服务:

XXX.validators.is_single_entry:
    class: XXX\CommonBundle\Validator\Constraints\IsSingleEntryValidator
    arguments:
        - "@doctrine.orm.default_entity_manager"
    tags:
        - { name: validator.constraint_validator, alias: single_entry_validation }

还有验证器类:

class IsSingleEntryValidator extends ConstraintValidator
{

    /**
     * @var EntityManager
     */
    protected $em;

    /**
     * Constructor
     *
     * @param EntityManager $em
     */
    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public function validate($value, Constraint $constraint)
    {
        ...
    }

    public function validateBy()
    {
        return 'single_entry_validation';
    }
}

以及validator的使用:

/**
 * @ORM\Column(name="is_primary", type="boolean", nullable=true)
 * @SiteAssert\IsSingleEntry(message="validator.single.entry")
 */
protected $isPrimary;

【问题讨论】:

  • 我的 EntityManager 依赖项称为 @doctrine.orm.entity_manager ... 在您的控制台上运行 container:debug 命令并确保您的依赖项称为 doctrine.orm.default_entity_manager。如果这不是问题所在,我和你一样陷入困境 - 否则看起来很完美。
  • 您是否尝试过清除缓存并重新启动 php?

标签: php validation symfony doctrine-orm


【解决方案1】:

@Ragdata - 学说.orm.default_entity_manager Doctrine\ORM\EntityManager

我的代码实际上有 2 个错误。

validationBy() 函数的调用

这个函数应该在 IsSingleEntry 类中调用,而不是在 IsSingleEntryValidator

方法名应该不同

我调用方法 validateBy() 但正确的函数名称应该是 validatedBy()

所以代码现在应该是这样的:

IsSingleEntry

class IsSingleEntry extends Constraint
{
    public $message = "The value already exists in the database";

    /**
     * @return string
     */
    public function validatedBy()
    {
        return 'single_entry_validation';
    }
}

IsSingleEntryValidator

class IsSingleEntryValidator extends ConstraintValidator
{

    /**
     * @var EntityManager
     */
    protected $em;

    /**
     * Construct
     *
     * @param EntityManager $em
     */
    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    /**
     * Validate
     *
     * @param mixed $value
     * @param Constraint $constraint
     */
    public function validate($value, Constraint $constraint)
    {
        $oActiveExists = $this->em->getRepository('DatabaseBundle:Languages')->findOneByIsPrimary(true);

        if ($oActiveExists) {
            $this->context->buildViolation($constraint->message)
                ->addViolation();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多