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

Pau*_*ean 5 forms service dependency-injection symfony doctrine-orm

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

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

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

Flo*_*ian 15

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

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(),
         ));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的控制器中例如:

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

     // more stuff
}
Run Code Online (Sandbox Code Playgroud)

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

唯一的区别是它需要注意使用DIC实现类型的实例化,并注入正确的依赖项.然后,您只需要修改您的控制器:

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

     // more stuff
}
Run Code Online (Sandbox Code Playgroud)


met*_*eor 7

表单类型中的翻译服务访问示例:

你的表单类型:

class TaskType extends AbstractType {
    ....
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            't' => 'Symfony\Bundle\FrameworkBundle\Translation\Translator',
        ));
    }  

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $t = $options['t'];
        $t->trans('string to translate');
        ....
    }
Run Code Online (Sandbox Code Playgroud)

控制器:

public function someAction() { 
    $form = $this->createForm(new TaskType(), 
                                $task, 
                                array('t' => $this->get('translator')));
Run Code Online (Sandbox Code Playgroud)