我有以下代码:
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
但我猜不是。
答案 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