1

サービスとして定義されたコントローラーが 1 つあり、それには異なる引数があります。

それは次のようなものです:

   <service id="my.controller" class="%my.controller.class%">
       <argument type="service" id="form.factory"/>
       <argument type="service" id="templating"/>
       <argument type="service" id="router"/>
       <argument type="service" id="validator"/>
        <call method="setEntityManager">
            <argument type="service" id="doctrine.orm.entity_manager" />
       </call>
       <call method="getExpenseRepository">
            <argument>Expense</argument>
       </call>
   </service>

ここで、上記と同じ引数を使用する別のコントローラーが必要です。サービス ID とクラスを変更するだけでこれを再度作成しないようにするにはどうすればよいですか?

そしてもう1つ-私が持っている最初のコントローラーで:

private $formFactory;
private $templating;
private $router;
private $validator;

public function __construct($formFactory, $templating, $router, $validator)
{
    $this->formFactory = $formFactory;
    $this->templating = $templating;
    $this->router = $router;
    $this->validator = $validator;
}

2番目のもので書き直すのを避けることはできますか?

よろしくお願いします!:)

4

2 に答える 2

2

抽象的な親サービスを作成し、そこから他のサービスを継承できます。サンプル構成は次のようになります。

   <service id="my.parentcontroller" class="%my.parentcontroller.class%"  abstract="true">
     <argument type="service" id="form.factory"/>
     <argument type="service" id="templating"/>
     <argument type="service" id="router"/>
     <argument type="service" id="validator"/>
      <call method="setEntityManager">
          <argument type="service" id="doctrine.orm.entity_manager" />
     </call>
     <call method="getExpenseRepository">
          <argument>Expense</argument>
     </call>
   </service>

<service id="my.controller1" class="%my.controller1.class%" parent="my.parentcontroller"/>
<service id="my.controller2" class="%my.controller2.class%" parent="my.parentcontroller"/>

また、コントローラー クラスは抽象親コントローラーから継承する必要があります。

于 2013-08-05T10:57:33.663 に答える
1

繰り返しを減らすために、共通の親サービスを作成して指定できます: http://symfony.com/doc/current/components/dependency_injection/parentservices.html

抽象コントローラー クラスを定義することもできます。

子コントローラーは、このクラスを拡張して親サービスを呼び出すだけで済みます。

于 2013-08-05T10:49:09.377 に答える