在symfony 3.0中将表单定义为服务


Define form as service in symfony 3.0

我知道还有另外两个问题,但我认为它们都没有解决我要问的问题。

在Symfony 2.8中,有一个弃用说明,关于用"别名"标记定义为服务的表单,thant可以用来传递给"createForm"来获取表单。

因此,如果我错了,请纠正我,现在我们必须定义没有别名标签的服务:

#src/MyBundle/Resources/config/services.yml
my.form.as.service:
    class: MyBundle'Form'Type'MyFormType
    arguments: ["@doctrine.orm.entity_manager",%myparameter1%]
    tags: { - name: form.type }

在控制器中:

$form = $this->createForm('my.form.as.service');

但这给了我一个表单命名错误,因为表单在 getName 函数中返回"my_name",并且它期望表单接收 FQCN。好的,在控制器中的其他响应之后,我更改为:

use MyBundle'Form'Type'MyFormType;
...
$form = $this->createForm(MyFormType::class)

这有效,在 github symfony 成员中说表单组件可以完成所有工作......但是,如果我想定义具有相同类但使用另一个参数而不是 %parameter1% 的 seccond 服务怎么办。在 2.8 及更早版本中,我能够定义另一个服务并将其名称传递给 createForm 函数,但现在它直接获取类,我可以这样做吗?(我知道这样做可能很奇怪或没有必要,或者...

对于symfony成员:我和Javiereguiluz一样,这种变化使你编写更多的代码,并且使你无法完全控制表单组件如何使用你的服务。有必要删除表单别名以使我们的生活如此复杂吗?谢谢!

对不起,我一开始误读了你的问题。现在,正确答案:

如果您的表单类型

需要具有动态配置设置(例如参数),则应改为创建表单类型选项。这允许动态更改此设置:

class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $form, array $options)
    {
        $options['your_setting']; // read the option
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setRequired('your_setting'); // add a required option
    }
}

用法:

$this->createForm(MyFormType::class, null, [
    'your_setting' => 'some value',
]);

或者,您也可以将设置默认为某个静态值或参数:

class MyFormType extends AbstractType
{
    private $yourSetting;
    public function __construct($yourSetting)
    {
        $this->yourSetting = $yourSetting;
    }
    // ...
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefault('your_setting', $this->yourSetting);
    }
}

您可以在选项解析程序组件文档中阅读有关此内容的更多信息。

我问了同样的问题,并在这里回答了自己: Symfony 2.8/3.0 升级:如何处理带有变量参数的表单类型?

不幸的是,这是Symfony 3.0中的一个限制,并且没有解决方案。

一种解决方案是为每个表单创建一个类(而不是一个公共类),并使它们中的每一个扩展一个公共抽象类以避免代码重复。

但这仍然需要您创建许多类,这不是最佳选择。