看看那段代码
<?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
。请记住,我的对象想要一个存储库。那么,我是否要再次声明我的所有对象,我想要使用它们的每个控制器的动作?我想这必须存在一种更聪明的方法,但目前我还不明白哪种方法。
答案 0 :(得分:2)
将StrutturaManager
定义为service并将EntityManager
注入其中。这样管理员就可以访问您需要的存储库,控制器也不会知道Doctrine和存储库 - 这是一个很好的做法。