【问题标题】:Access current entity in custom symfony2 constraint validator在自定义 symfony2 约束验证器中访问当前实体
【发布时间】:2013-04-03 11:09:55
【问题描述】:

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

【问题讨论】:

    标签: symfony


    【解决方案1】:

    如果你有属性验证器,你也可以通过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();
        }
    }
    

    【讨论】:

    • 这将返回 null。知道为什么吗?
    【解决方案2】:

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

    【讨论】:

    • 谢谢!文档有些不清楚,所以我没有引用。
    • @EirikA.Johansen,你能举个例子吗?我正在尝试做与 Symfony 示例中描述的相同的事情,但没有成功。一个更详细的例子将是完美的。
    【解决方案3】:

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

    实体:

    <?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;
        }
    }
    

    约束验证器:

    <?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 确实为我提供了实体类名称,它正在工作!

    【讨论】:

    • 太棒了!只说一点:你也可以使用dump 代替var_dump。它以非常漂亮的格式和样式显示输出。
    【解决方案4】:

    嗯,这取决于您如何验证实体。例如,我正在通过表单验证我的实体,因此,要在 ConstraintValidator 中获取实体,我只需要获取上下文根并从我的表单中获取数据:

    /**
     * @Annotation
     */
    class ValidDnieValidator extends ConstraintValidator
    {
    
        public function validate($value, Constraint $constraint)
        {
    
            $user = $this->context->getRoot()->getData();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2011-10-23
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多