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 和类来避免再次编写此内容?

还有一件事-在我拥有的第一个控制器中:

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;
}

我可以避免在第二个中重写它吗?

首先十分感谢!:)

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 回答