【问题标题】:Symfony change service scope to prototype does not work on formtype servicesSymfony 将服务范围更改为原型不适用于表单类型服务
【发布时间】:2014-04-25 08:27:10
【问题描述】:

我将表单用作服务(对于我的表单和“自定义表单类型”也是如此)。 在我的一个表单中,我有两个字段,它们是两个自定义 FormType

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('primary', 'shamp_searchable', [
            'class'  => '\Udg\CoreBundle\Entity\Ingredients\Ingredient',
            'source' => $this->router->generate('adminIngredient_search'),
        ])
        ->add('secondaries', 'shamp_searchable', [
            'class'    => '\Udg\CoreBundle\Entity\Ingredients\Ingredient',
            'source'   => $this->router->generate('adminIngredient_search'),
            'multiple' => true,
        ])
...
}

由于某种原因,我需要 shamp_searchable 表单类型的两个实例不同 所以在我的service.yml 中,我将范围更改为prototype,我们可以在文档中看到

shamp.form.shamp_searchable_:
    class: Shamp\CoreBundle\Form\Type\SearchableOneToManyType
    scope: prototype
    arguments:
        - @shamp.form.shamp_searchable_onetomany.data_transformer
    tags:
        - { name: form.type, alias: shamp_searchable }

shamp.form.shamp_searchable.data_transformer:
    class: Shamp\CoreBundle\Form\DataTransformer\SearchableOneToManyDataTransformer
    scope: prototype
    arguments:
        - @doctrine.orm.entity_manager

但最后它并没有给我两个不同的实例(用spl_object_hash检查)

我的问题是,您知道如何获得不同的实例吗?

【问题讨论】:

    标签: php symfony dependency-injection


    【解决方案1】:

    当使用{ name: form.type, alias: shamp_searchable } 标记时,您基本上是在FormType 数组中添加一个条目,该条目将被传递给表单组件。

    您的服务仅从 DIC 请求一次:初始化此数组时。当 Form 组件需要你的 FormType 时,它只会通过别名从这个数组中检索它。


    您必须创建一个创建 shamp 表单类型的工厂服务的解决方案:

    /**
     * @param ShampSearchableFormTypeFactory $shampFactory
     */
    public function __contruct(ShampSearchableFormTypeFactory $shampFactory)
    {
        $this->shampFactory = $shampFactory;
    }
    
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('primary', $this->shampFactory->createFormType(), [
                'class'  => '\Udg\CoreBundle\Entity\Ingredients\Ingredient',
               'source' => $this->router->generate('adminIngredient_search'),
            ])
            ->add('secondaries', $this->shampFactory->createFormType(), [
                'class'    => '\Udg\CoreBundle\Entity\Ingredients\Ingredient',
                'source'   => $this->router->generate('adminIngredient_search'),
                'multiple' => true,
            ])
        ...
    }
    

    已编辑:标签重复不起作用

    【讨论】:

    • 复制别名不起作用,找不到第二个别名:“无法加载类型“shamp_searchable_2””。好方法似乎改为使用表单事件。我将尝试使用工厂作为快速修复(无需更改太多代码)
    • 我刚刚查看了管理表单类型别名的编译器通道,它认为每个表单只有一个标签:/ 我不明白您为什么要查看表单事件获得预期的结果(除非secondaries formtype 依赖于primary 之一)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多