有人可以帮我弄清楚为什么我的Callback验证方法没有被调用。
基本上我需要做的是使用以下逻辑进行自定义验证: - 在表单中我有5个字段,如果全部为空,表单应该是有效的, - 但是如果其中任何一个不是空的,则所有这些都不需要为空 (它们用于在用户配置文件上构建真实地址)
我已按照以下文档进行操作:http://symfony.com/doc/2.3/reference/constraints/Callback.html
我有以下代码:
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="UserRepository");
* @UniqueEntity("email")
* @ORM\HasLifecycleCallbacks
* @Assert\Callback(methods={"isAddressValid"})
*/
class User extends WebserviceUser implements UserInterface, EquatableInterface
{
...
public function isAddressValid(ExecutionContextInterface $context)
{
//die("I GOT HERE");
$context->addViolationAt('sna4', 'Frikin validation'!', array(), null);
}
}
属性sna4位于正在扩展的类中。
提前谢谢。
答案 0 :(得分:4)
回调注释需要(如果已定义)与关联的验证组。
作为示例,在不同的表单上下文中使用的实体具有特定表单的验证自定义:
实体类:
/**
*
* @Assert\Callback(methods={"validateCommunicationEmail"}, groups={"userProfile"})
* @Assert\Callback(methods={"validatePreference"}, groups={"userPreference"})
*/
class AcmePreferences
{
....
public function validateCommunicationEmail(ExecutionContextInterface $context)
{
if ($this->getIsCommunicationsEnabled() && ! $this->getAdministrativeCommunicationEmail())
{
$context->addViolationAt('isCommunicationsEnabled','error.no_administrative_email_selected');
}
}
}
表单类型:
class AcmePreferencesType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class'=> 'Acme\DemoBundle\Entity\AcmePreferences',
'validation_groups' => array('userProfile')
));
}