有没有办法在自定义约束验证器中访问当前正在验证的属性的实体,如果是,如何?据我所知,我只能访问价值(当然,我可能选择注入的任何服务)。
答案 0 :(得分:8)
如果您有属性验证器,您还可以通过ExecutionContext访问Validator中的验证对象:
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)
/**
* @Annotation
*/
class ValidDnieValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
$user = $this->context->getRoot()->getData();