forms - 在 Symfony2 的表单类型中使用自定义服务

标签 forms symfony service dependency-injection doctrine-orm

在我的 Symfony2 项目中,我需要在数据库中生成现有表的列表。由于在我的项目中并不是所有的表都被用作实体,而且列表本身需要是一个简单的数组而不是一个实体,所以我为此编写了一个 sql 语句。此 sql 语句嵌入在自定义服务的函数中(并且已经过彻底测试)。

现在,在表单类型中,我想用上述函数的结果数组填充一个字段。这些成为用户可以选择的选项。

我的问题是如何以我的表单类型访问服务?

最佳答案

有一个简单的解决方案,它是纯 OOP,没有特定于框架的配置。
只需使用构造函数手动将您的服务实例注入(inject)您的表单类型实例:

class SomeType extends AbstractType
{
    private $provider;

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

    public function buildForm(FormBuilder $builder, array $options)
    {
         $builder->add('tables', 'choices', array(
             'choices' => $this->provider->getTableNames(),
         ));
    }
}

然后,在您的 Controller 中,例如:

public function newAction()
{
     $form = $this->createForm(new SomeType($this->get('table_name_provider'));

     // more stuff
}

可以使用框架配置完成完全相同的操作,如下 http://symfony.com/doc/2.0/cookbook/form/create_custom_field_type.html#creating-your-field-type-as-a-service .

唯一的区别是它关心使用 DIC 实例化您的类型,并注入(inject)正确的依赖项。然后,您只需要修改您的 Controller :

public function newAction()
{
     $form = $this->createForm('some_type_alias');

     // more stuff
}

关于forms - 在 Symfony2 的表单类型中使用自定义服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14356173/

相关文章:

Android:使用处理程序和可运行更新应用程序小部件 TextView

web-services - 继续运行 Go Server 作为后台进程

symfony - 学说 :generate:entities vs generate:doctrine:entities in Symfony2 console

javascript - 如何有条件地提交表单?

html - 复选框和单选按钮不起作用

javascript - 更好地练习 Jquery 与 Document.formname.formelement.value

php - 具有多个具有相同名称的查询字符串参数的 Symfony HttpClient GET 请求

html - Symfony2,学说扩展树 : Generating a "tree"-like dropdown Select list

java - Centos java定制服务

javascript - 表单 ID 重复