访问自定义symfony2约束验证器中的当前实体

时间:2013-04-03 11:09:55

标签: symfony

有没有办法在自定义约束验证器中访问当前正在验证的属性的实体,如果是,如何?据我所知,我只能访问价值(当然,我可能选择注入的任何服务)。

4 个答案:

答案 0 :(得分:8)

如果您有属性验证器,您还可以通过ExecutionContext访问Validator中的验证对象:

http://api.symfony.com/2.8/Symfony/Component/Validator/Context/ExecutionContextInterface.html#method_getObject

class SomeValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        $object = $this->context->getObject();
    }
}

答案 1 :(得分:7)

是的,有办法。 Class constraint validator有一个完整的实体。

答案 2 :(得分:5)

我也需要这个。 请在下面找到完整的示例:

实体:

<?php
namespace AppBundle\Entity\MarketPlace;

use Doctrine\ORM\Mapping AS ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use AppBundle\Model\BaseCategoryClass as BaseCategory;
use AppBundle\Validator\Constraints as FMUAssert;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\MarketPlace\ProductRepository")
 * @Gedmo\Tree(type="nested")
 * @FMUAssert\UnitConstraint()
 */
class Product extends BaseCategory
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer", length=11)
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

约束:

<?php
namespace AppBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class UnitConstraint extends Constraint
{
    public $message = 'La chaîne "%string%" contient un caractère non autorisé : elle ne peut contenir que des lettres et des chiffres.';

    public function validatedBy()
    {
        return 'unit_validator';
    }

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

约束Validator:

<?php
namespace AppBundle\Validator\Constraints;

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

class UnitConstraintValidator extends ConstraintValidator
{
    public function validate($entity, Constraint $constraint)
    {
        exit(var_dump(get_class($entity)));
        $this->context->addViolation($constraint->message, array('%string%' => $value));
    }
}

宣言即服务:

services:
    unit_validator:
        class: %unit_validator.class%
        tags:
            - { name: validator.constraint_validator, alias: unit_validator }

我放弃的退出vardump确实为我提供了实体类名称,它正在运作!

答案 3 :(得分:1)

是的,这取决于你如何验证实体。例如,我正在通过Form验证我的实体,因此,为了获得ConstraintValidator中的实体,我只需要获取de context root并从我的表单中获取数据:

/**
 * @Annotation
 */
class ValidDnieValidator extends ConstraintValidator
{

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

        $user = $this->context->getRoot()->getData();