0

我已经搜索过,但找不到任何类似的问题,或者我的措辞有误。我想要实现的是访问我的 Bundle 中所有控制器中的对象。例如:

<?php

namespace Example\CoreBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class FolderController extends Controller
{

    function indexAction()
    {

         $title = $this->folder->getTitle();
         $description = $this->folder->getDescription();

    }

}

通常在 Symfony 之外,我自己会使用 BaseController extends Controller 扩展 Controller 类,并在构造方法中设置它,但我知道 Symfony 不使用构造方法,所以我有点不知道该去哪里。

我通常会做这样的事情:

class BaseController extends Controller
{

     function __construct()
     {

          parent::__construct();
          //load up the folder from my model with an ID
          $this->folder = $folder;

     }

}

然后我会从 FolderController 扩展 BaseController 并从那里开始,但我已经用 Symfony 尝试过,但它不起作用。我已经研究过服务,但认为这不是我完成这项工作所需要的。如果需要更多详细信息,请告诉我,谢谢。

4

1 回答 1

1

如果我正确理解您的问题,服务确实是您正在寻找的。

首先,在 中定义一个服务services.yml

services:
    vendor.folder_manager:
        class: Vendor\FolderBundle\Entity\Manager\FolderManager
        arguments:
            em: "@doctrine.orm.entity_manager"
            class: Vendor\FolderBundle\Entity\Folder

然后创建FolderManager该类:

<?php
namespace Vendor\FolderBundle\Entity\Manager;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;

class FolderManager
{
    protected $em;

    protected $repo;

    protected $class;

    public function __construct(EntityManager $em, $class) {
        $this->em = $em;
        $this->class = $class;
        $this->repo = $em->getRepository($class);
    }

    public function findById($id) {
        return $this->repo->findById($id);
    }

    public function getRepository() {
        return $this->repo;
    }
}

最后,在您的控制器中:

$this->container->get('vendor.folder_manager')->findById($folderId);

或者:

$this->container->get('vendor.folder_manager')->getRepository()->findById($folderId);

Symfony2 会自动将实体管理器类注入到管理器中,因此您在控制器中只需要提供文件夹的 id。

编辑: 为了让它更漂亮,您还可以在控制器中创建一个快捷功能:

protected function getFolderManager()
{
    return $this->container->get('vendor.folder_manager');
}

然后你可以这样做:

$this->getFolderManager()->findById($folderId);
于 2013-05-18T21:37:29.097 回答