0

我想对特征使用回调验证。例如:

<?php
namespace Vendor\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;

/**
 * @Assert\Callback(methods={"validateReview"}, groups={"review"})
 */
trait ReviewableEntity
{
    //...

    /**
     * @param ExecutionContext $context
     */
    public function validateReview(ExecutionContext $context)
    {

        //...

        $context->addViolationAt('review', 'Review must be valid', [], null);

        //...

    }

    //...

}

但这似乎不起作用。任何人都知道这是否可能?

4

2 回答 2

1

我也有同样的问题。通过谷歌找到这个......所以:我重现了这个问题。同样在这里。

额外的信息:如果你在 trait 中的属性上添加 @Assert 注释,它将起作用。只是回调不起作用。

于 2013-05-24T14:05:11.533 回答
1

如果注解在特征上(而不是在方法上,这可以通过 Symfony 实现2.4+),回调验证器不能与特征中的注解一起使用。

如果您的 Symfony2 版本早于以下版本,则必须使用此方法2.4

namespace Vendor\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;
use Symfony\Component\Validator\Mapping\ClassMetadata;

trait ReviewableEntity
{
    //...

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addConstraint(
            new Assert\Callback(
                'validateReview',
                array(
                    'groups' => array('review'),
                )
            )
        );
    }

    /**
     * @param ExecutionContext $context
     */
    public function validateReview(ExecutionContext $context)
    {

        //...

        $context->addViolationAt('review', 'Review must be valid', [], null);

        //...

    }

    //...

}

这只是处理验证器的普通 php 方式,无需使用 XML 或 YML 中的注释或配置文件。

我用这个谷歌查询“ github symfony entity trait assert callback”找到了这个答案,因为我正在解决同样的问题。对我来说,第一个结果是这个 gihtub 页面,其中包含解决问题的代码

于 2014-11-03T21:09:50.570 回答