在Symfony2中使用控制器外部的存储库

b85*_*411 5 doctrine controller symfony

我目前正在使用一个函数来获取我的存储库:

public function getRepositories()
{
    // Tasks
    $tasks = $this->getDoctrine()
        ->getRepository('Model:Task');

    // Task Info
    $taskInfos = $this->getDoctrine()
        ->getRepository('Model:TaskInfo');


    return array(
        'tasks'             => $tasks,
        'taskInfos'         => $taskInfos,
    );
}
Run Code Online (Sandbox Code Playgroud)

所以在我的控制器动作中,我可以像这样调用一些SQL:

$repositories = $this->getRepositories();
$task = $repositories['tasks']->findOneById($id);
Run Code Online (Sandbox Code Playgroud)

但是现在我有一些控制器,我注意到我正在将相同的getRepositories()函数复制到每个控制器中,因为它重复复制代码.

我想要的是拥有一个帮助类,这可能是其中的一个功能.

但是我如何做到这一点,因为助手类不会是一个控制器,$this->getDoctrine()显然不会有效?

谢谢

LBr*_*dge 6

您可以使用服务(http://symfony.com/doc/current/book/service_container.html)并注入学说.

services:
    my.helper.class:
        class: Acme\MyBundle\Helper\MyHelper
        arguments: [ @doctrine.orm.entity_manager ]
Run Code Online (Sandbox Code Playgroud)
<?php

namespace Acme\MyBundle\Helper;

use Doctrine\ORM\EntityManager;

class MyHelper
{ 
    protected $manager;

    public function __construct(EntityManager $manager)
    {
        $this->manager = $manager;
    }

    public function getRepositories()
    {
        $tasks = $this->manager->getRepository('Model:Task');
        $taskInfos = $this->manager->getRepository('Model:TaskInfo');

       return array(tasks, taskInfos);
    }
}
Run Code Online (Sandbox Code Playgroud)

话虽这么说,我并不真正了解你的情况,因为控制器是为了获取数据并将其返回.

你不是在重复逻辑.

看起来太多了,实体经理已经是这样的帮手了.