如何扩展使用JMS Di Extra @Service注释定义的Symfony2服务?

时间:2013-04-25 17:01:19

标签: symfony symfony-2.1

假设我在可重复使用的包中有一个FormType,如下所示:

/**
 * @Service("acme_core_purchase.form.add_to_basket")
 * @FormType
 */
class AddToBasketType extends AbstractType
{}

在我的控制器中,我注入它,做我需要的任何事情:

/** @Inject("acme_core_purchase.form.add_to_basket") */
protected $add_to_basket_form;

在一个特定的项目中说我想扩展该表单并添加一些额外的字段,我打算用注释做什么?

class AddToBasketType extends BaseAddToBasketType
{}
  • 我不能只创建一个具有相同服务名称的表单,而不是 工作/有意义 - 任务不遵循设定的优先级 据我所知,AppKernel :: registerBundles。我怀疑这是 无论如何,在概念上存在缺陷。

  • 我可以更改服务名称,但是我需要注入不同的服务名称 我到处使用它的服务,包括扩展所有 那些东西。

  • 我可以将服务名称存储在参数中然后注入它 到处都是这样,我可以拥有正确的服务名称 注入到处都是,但我还需要注入容器 能够检索服务。

  • 在我需要的地方,我一直在做后者,但肯定在那里 是一个更好的方法?或者至少应该有。

2 个答案:

答案 0 :(得分:0)

简单,使用Form组件自己的继承。

/**
 * @Service("acme_core_purchase.form.add_to_basket")
 * @FormType
 */
class AddToBasketType extends AbstractType
{
    public function getName() { return 'add_to_basket'; }
    public function getParent() { return 'form'; }
}

/**
 * @Service("whatever")
 * @FormType
 */
class AddToBasket2Type extends AbstractType
{
    public function getName() { return 'add_to_basket2'; }
    public function getParent() { return 'add_to_basket'; }
}

答案 1 :(得分:0)

查看annotation configs

的服务内容

注意parent="another.service.id"

<?php

use JMS\DiExtraBundle\Annotation\Service;

/**
 * @Service("some.service.id", parent="another.service.id", public=false)
 */
class Listener
{
}