0

我的控制器中有 init() 方法,如下所示:

class MyController extends GlobalController
{

    private function init()
    {
        $this->setVariables($first = false, $second = true); // this comes from GlobalController
        $this->bill_repository = $this->setRepository('Bill');
        $this->var = .....;
        ....
    }

    ...
}

和 GlobalController 是这样的:

class GlobalController extends BaseController
{
    //Frequently used variables
    protected $user;
    protected $em;
    protected $expense_repository;

    protected function setVariables($first, $second)
    {
        $this->user = $this->container->get('security.context')->getToken()->getUser();

        if($first){
            $this->em = $this->getDoctrine()->getEntityManager();
        }

        if($second){
            $this->expense_repository = $this->setRepository('Expense');
        }
    }
}

如何使用服务改善这一点?阅读 Symfony 的文档后我得到的理解是,我应该将这两个控制器都定义为服务和类似这样的东西:

<service id="my_controller" class="path/MyController" />

<service id="mycontroller_manager" class="path/GlobalController">
    <call method="setVariables">
         <argument type="???" id="???" />
    </call>
</service>

但我不太确定这一点,也不太确定如何填写参数部分,或者我应该使用属性注入?请帮助我更好地理解这一点并改进我的代码:(

4

1 回答 1

1

您总是要在具体类(继承它的抽象类)上应用注入。您不能为所有抽象实现设置默认值。

与其将多个参数应用于一个模棱两可的 setArguments() 方法,您可能希望隐式地为每个依赖项设置设置器(对于每个依赖项——如果需要,您可以将其重构为单个方法)。

<service id="my_controller" class="path/MyController"
    <call method="setUser">
         <argument type="service" id="security.context" />
    </call>
    <call method="setDoctrine">
         <argument type="service" id="doctrine.orm.entity_manager" />
    </call>
    <call method="setRepositoryName">
         <argument>Expense<argument>
    </call>
/>

没有更多的 init 方法。

class MyController extends GlobalController
{
}

现在我们需要实现设置器来使用依赖项。

class GlobalController extends BaseController
{
    /** properties */

    public function setEntityManager(\Doctrine\Orm\EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function setUser(\Symfony\Component\Security\Core\SecurityContext $securityContext)
    {
        $this->user = $securityContext->getToken()->getUser();
    }

    public function setRepositoryName($repositoryName)
    {
        $this->repositoryName = $repositoryName;
    }
}
于 2013-07-19T13:06:21.963 回答