未调用Symfony2实体注释断言/回调方法

时间:2012-10-23 12:31:31

标签: symfony callback annotations assert

我遇到Assert/Callback验证问题。我使用this作为我的代码的示例,但Symfony只是忽略了验证功能。这是我的实体代码的相关部分

namespace Vendor\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo; // gedmo annotations
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;


/**
 * @Assert\Callback(methods={"isValidFirma"})
 * @ORM\Entity(repositoryClass="Vendor\Bundle\Entity\UserProfileRepository")
 * @ORM\Table(name="user_profile")
 */
class UserProfile
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    //...

    public function isValidFirma(ExecutionContext $context){
        $context->addViolationAtSubPath('Firma', 'Company name must be present', array(), null);
        // as of sf 2.3 use addViolationAt() instead [reference: https://github.com/propelorm/PropelBundle/issues/234 ]
    }    

    //...            

}
永远不会调用

isValidFirma。我尝试了validation.yml文件而不是注释,没有成功。我清理缓存大约五十次,每次更改后都没有帮助。可能是什么问题?

1 个答案:

答案 0 :(得分:3)

解决方案。问题出在使用过的验证组中。断言验证器必须是该组的一部分,否则它不会触发。 表单类文件中的这段代码是罪魁祸首:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $vg = array('my-profile');


    $resolver->setDefaults(array(
        'validation_groups' => $vg
    ));
}

将断言更改为

* @Assert\Callback(methods={"isValidFirma"}, groups={"my-profile"})

做了这个伎俩。