ChoiceList作为服务可能吗?

时间:2014-07-10 13:51:53

标签: forms symfony

我有以下代码:

namespace Acme\Demo\Form;

use Symfony\Component\Form\Extension\Core\ChoiceList\LazyChoiceList;
use Symfony\Component\Form\Extension\Core\ChoiceList\SimpleChoiceList;

class MyChoiceList extends LazyChoiceList
{
    protected function loadChoiceList()
    {
        return SimpleChoiceList(array('t'=>'test'));
    }
}

services.yml:

SMyChoiceList:
    class: Acme\Demo\Form\MyChoiceList;

然后当我尝试做的时候:

$builder
    ->add('mychoice', 'choice', array('choice_list' => 'SMyChoiceList'
    ));

我明白了:

The option "choice_list" with value "SMyChoiceList" is expected to be of type "null", "Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface"

LazyChoiceList已经实施了ChoiceListInterface ...所以我猜测Symfony2 choice_list参数不支持服务或者我错过了什么?

我认为它的工作方式类似于http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#form-cookbook-form-field-service

但我猜不是。

1 个答案:

答案 0 :(得分:2)

用..

'choice_list' => 'SMyChoiceList'

..你只是在使用一个字符串。

您可以使用..

直接调用它
'choice_list' => new MyChoiceList()

或者,如果它有依赖项,您可以将其注入到表单构造函数中,如..

your.form:
    class: %your.form.class%
    arguments:
        - @SMyChoiceList
    tags:
        - { name: form.type, alias: your_form_alias }

..然后在你的表格中使用它..

protected $choiceList;

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

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('mychoice', 'choice', array(
            'choice_list' => $this->choiceList,
        ))
    ;
}

<强>更新

要在自定义表单类型中使用您的选择列表,您可以执行以下操作(使用与上面相同的服务设置)...

protected $choiceList;

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

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'choice_list' => $this->choiceList,
    ));
}

public function getParent()
{
    return 'choice';
}

public function getName()
{
    return 'your_form_alias';
}

然后您可以使用而不是选择,例如......

$builder
    ->add('something', 'your_form_alias', array(
        // Your choice options (expanded, label, attr, etc)
    ))
;

这一切都在您之前添加的页面中,更具体地说是http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#defining-the-field-type