2012-11-16 76 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

您可以將頁面重定向到用戶個人資料頁面,而不是加載消息表單並指出用戶在添加消息之前需要添加電子郵件。如果您快速重定向或創建彈出窗口,只要用戶添加電子郵件後可以返回到原始頁面,用戶可能不會關閉。然後驗證很簡單,因爲您只需要驗證用戶實體。