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 中设置的优先级。无论如何,我怀疑这在概念上是有缺陷的。

  • 我可以更改服务名称,但是我需要在我使用过的任何地方注入不同的服务,这涉及扩展所有这些内容。

  • 我可以将服务名称存储在一个参数中,然后将其注入任何地方,这样我就可以在任何地方注入正确的服务名称,但我还需要注入容器才能检索服务。

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

4

2 回答 2

1

很简单,使用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'; }
}
于 2013-04-25T17:34:23.390 回答
0

看看他们的注释配置的服务部分

注意parent="another.service.id"

<?php

use JMS\DiExtraBundle\Annotation\Service;

/**
 * @Service("some.service.id", parent="another.service.id", public=false)
 */
class Listener
{
}
于 2013-07-02T20:12:38.127 回答