2012-08-10 55 views
1

我試着通過我的變量形式驗證程序約束,但不能。 我做的是:傳遞自定義變量,以形成驗證

$payForm = $this->createForm(new CableTVPayType(), null, array('balance' => $balance)); 

而且在CableTVPayType:

public function getDefaultOptions(array $options) 
{ 
    $maxSumm = $options['balance'] - 100; 
    [...] 

它工作正常,我maxSumm是我想要的,但Symfiony檢查$ options數組。 '餘額'不是默認選項,並抱怨這:

The option "balance" does not exist 

是否有另一種更正確的方式來傳遞自定義變量驗證?

+0

順便說一句,你的問題是誤導。你問的是驗證,而代碼示例是關於將自定義選項傳遞給表單類型的。 – 2012-08-10 07:06:00

回答

0

完成這個!一類

板條箱變,並傳遞價值,它通過構建方法

class CableTVPayType extends AbstractType { 

    private $maxSumm; 

    public function __construct($maxSumm) { 
     $this->maxSumm = $maxSumm; 
    } 

創建形式參數

$payForm = $this->createForm(new CableTVPayType($someValue)); 

現在,我想在我的形式,我可以使用這個變量。

+0

接受你的答案,請 – 2012-08-10 05:52:42

+0

不要使用構造函數來實例特定的東西。詳情請參閱我的回答。 – 2012-08-10 06:49:39

2

使用的東西構造由一個類型的所有情況下使用。例如,你的類型可能需要一個實體管理器才能工作。它將在所有表單實例中重用。

例如具體的東西使用的選項。如果您將構造函數用於特定於實例的東西,則所有實例都將獲得您傳遞給第一個實例構造函數的值。

/** 
* @FormType 
*/ 
class PayType extends AbstractType { 

    private $someService; 

    /** 
    * @InjectParams 
    */ 
    public function __construct(SomeService $someService) 
    { 
     $this->someService = $someService; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'balance' => 0 
     ); 
    } 

    public function getName() 
    { 
     return 'pay'; 
    } 
} 
$form = $this->createForm('pay', null, array('balance' => $balance)); 

注意,@FormType註釋寄存器的類型爲服務。它允許您使用類型的名稱,而不是手動創建實例。當一個類型需要注入一個服務時,它變得更加方便。你在這種情況下只使用名稱 - pay - 而不是這樣的:

$form = $this->createForm(new PayType($this->get('some_service')), null, array(
    'balance' => $balance 
)); 
+0

顯然它不是'getDefaultOptions()',而是''setDefaultOptions()'。 否則它說 >選項「no_animal_type」不存在。已知的選項有:「action」,「attr」,「auto_initialize」,... – Bonswouar 2013-11-26 10:32:25