将自定义变量传递给表单验证

时间:2012-08-10 04:36:35

标签: symfony

我尝试将表单验证器中的变量传递给约束,但不能。 我这样做:

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

在CableTVPayType中:

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

它工作正常,我的maxSumm是我想要的,但Symfiony检查$ options数组。 'balance'不是默认选项,并且抱怨这个:

The option "balance" does not exist 

是否有另一种更正确的方式将自定义变量传递给验证?

2 个答案:

答案 0 :(得分: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
));

答案 1 :(得分:0)

完成此事!

类的Crate变量,并通过构造方法

将值传递给它
class CableTVPayType extends AbstractType {

    private $maxSumm;

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

使用参数

创建表单
$payForm = $this->createForm(new CableTVPayType($someValue));

现在我可以在我的表单中使用此变量。