2012-11-16 103 views
2

我有实体Message与多对一关系与实体UserSymfony2的形式:验证相关的实体属性

class Message 
{ 
    ... 
    /** 
    * @var User $sender 
    * 
    * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\User") 
    * @ORM\JoinColumn(name="sender_id", referencedColumnName="id") 
    * 
    **/ 
    private $sender; 
    ... 
    } 

如果$sender没有email值我需要为我的形式创造新的领域,所以我创建表单对位指示Message实体:

$user = $this->getUser(); 

    $message = new Message(); 
    $message->setSender($user); 

    $formBuilder = $this->createFormBuilder($message, array(
     'cascade_validation' => true 
    )); 

    $formBuilder->add('body', 'textarea'); 

    if (!$user->getEmail()) { 
     $formBuilder->add('email', 'email', array(
      'property_path' => 'sender.email' 
     )); 
    } 

,我已经对实体Uservalidation.yml一些验证规则。我可以通过我的验证规则自动验证此字段是否为另一实体形式的User实体?我不知道该怎么做。

我找到解决方法现在:创建新的MissingEmailType

class MissingEmailType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('email') 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\UserBundle\Entity\User', 
      'validation_groups' => array(
       'MissingEmail' 
      ), 
     )); 
    } 

    public function getName() 
    { 
     return 'missing_email'; 
    } 
} 

但它看起来复杂。有更好的解决方案吗?

回答

0

您可以将页面重定向到用户个人资料页面,而不是加载消息表单并指出用户在添加消息之前需要添加电子邮件。如果您快速重定向或创建弹出窗口,只要用户添加电子邮件后可以返回到原始页面,用户可能不会关闭。然后验证很简单,因为您只需要验证用户实体。