2012-02-14 60 views
1

我需要根據提交的數據實現表單驗證。儘管數據對象的invoice屬性爲true,但validation_groups數組不僅應包含「添加」驗證,還應包含「公司」。Symfony2中的動態驗證組

我在Symfony Docs https://github.com/symfony/symfony-docs/blob/master/book/forms.rst中找到了「基於提交數據的組」一章。

的問題是:

public function getDefaultOptions(array $options) 
{ 
    return array(
     'data_class' => 'Strict\PublicBundle\Entity\Booking', 
     'validation_groups' => function(FormInterface $form) 
     { 
       return array('booking'); 
     }, 
    ); 
} 

拋出這個錯誤:

Warning: Illegal offset type in /var/www/vendor/symfony/src/Symfony/Component/Validator/GraphWalker.php line 101 500 Internal Server Error - ErrorException

任何想法可能是錯誤的?

回答

2

我有一個替代方法:如果您能夠在綁定表單之前確定條件,則可以在創建表單時簡單地覆蓋默認的驗證組列表。

在我的情況下,我有一個會話中的訂單對象,跨多個表單頁面進行更新。 順序可以「交貨」或「皮卡」,如果交付前一個屏幕,我需要在此屏幕上驗證的詳細地址選定:

if ($order->getOrderType() == "Delivery") 
    { 
     $validationGroups = array('step3', 'delivery'); 
    } 
    else 
    { 
     $validationGroups = array('step3'); 
    } 

    $formType = new Form\Order3Type(); 
    $form = $this->createForm($formType, $order, array("validation_groups" => $validationGroups)); 
    $form->bindRequest($request); 

如果你的條件是形式,而不是已經在會議上,你總是可以直接從請求對象中提取值。

1
// MyFormType.php 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'data_class' => 'Strict\PublicBundle\Entity\Booking', 
     'validation_groups' => function (FormInterface $form) { 
      $data = $form->getData(); 

      $groups = ['booking']; 

      if ($data->invoice) { 
       $groups[] = 'company'; 
      } 

      return $groups; 
     }, 
    ]); 
}