1

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

$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 

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

4

2 回答 2

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
));
于 2012-08-10T06:48:45.190 回答
0

完成了!

类的 Crate 变量,并通过构造方法将值传递给它

class CableTVPayType extends AbstractType {

    private $maxSumm;

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

使用参数创建表单

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

现在我可以在我的表单中随意使用这个变量了。

于 2012-08-10T05:02:21.613 回答