在symfony 3.0

时间:2016-04-27 06:02:05

标签: php forms symfony-forms symfony

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

在Symfony 2.8中,有一个关于使用"别名"标记定义为服务的表单的弃用说明,可用于传递给" 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');

但这会给我一个表单命名错误,因为表单会返回' my_name'在getName函数中,它希望表单接收FQCN。好的,按照控制器中的其他响应,我改为:

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

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

对于symfony成员:我和Javiereguiluz一起说,这个更改会让你编写更多代码并使你无法完全控制表单组件如何使用你的服务。是否有必要删除别名以使我们的生活如此复杂?谢谢!

2 个答案:

答案 0 :(得分:3)

抱歉,我最初误读了你的问题。现在,正确答案

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

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);
    }
}

您可以在OptionsResolver component documentation

中详细了解相关信息

答案 1 :(得分:0)

我问同样的问题并在这里回答:Symfony 2.8/3.0 upgrade: how to deal with form types with variable parameters?

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

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

但是仍然需要你创建许多类,这不是最佳的。