关于Symfony控制器的事情让我感到震惊

时间:2012-09-18 14:34:31

标签: model-view-controller symfony

看看那段代码

<?php

namespace Sestante\SestanteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sestante\SestanteBundle\Model\StrutturaManager;

class MainController extends Controller
{
    public function indexAction(Request $request)
    {
        return $this->render('SestanteSestanteBundle:Main:index.html.twig');
    }

    public function showLodgingsAction(Request $request)
    {
        $repo = $this->getDoctrine()->getRepository('SestanteSestanteBundle:Struttura');
        $usr = $this->get('security.context')->getToken()->getUser();
        $usrId = $usr->getId();
        $sm = new StrutturaManager($repo);
        $lodgingList = $sm->retrieveLodgingsFromUser($usrId);
        return $this->render('SestanteSestanteBundle:Main:showLodgings.html.twig',array('lodgingList' => $lodgingList));
    }
}

这是我一直在编写的应用程序的控制器。

看看showLodgingsAction。我已经尝试将所有业务逻辑放入一个带有存储库的模型(StrutturaManager)(我直接从控制器传递,因为据我所知,它们只在这里或通过DI提供)查询我的数据库,做一些细化并返回一个我将渲染到模板上的列表。

第一个问题:这种“代码分离”是否良好,或者存在更好的方式来做我想做的事情?

第二个问题:假设现在我想将StrutturaManager类型的对象用于indexAction。请记住,我的对象想要一个存储库。那么,我是否要再次声明我的所有对象,我想要使用它们的每个控制器的动作?我想这必须存在一种更聪明的方法,但目前我还不明白哪种方法。

1 个答案:

答案 0 :(得分:2)

StrutturaManager定义为service并将EntityManager注入其中。这样管理员就可以访问您需要的存储库,控制器也不会知道Doctrine和存储库 - 这是一个很好的做法。