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 に答える