我正在构建几页应用程序。并想问一下使用控制器的正确方法是什么?
每个页面都有一个控制器?或者将页面作为方法放在同一控制器中?在我的情况下,我正在使用数据库,我真的无法将所有内容保存在一个方法中。在这种情况下,我创建了Helper类,帮助我保留并生成一些代码。
控制器:
class DefaultController extends Controller
{
//main method that performs as page
public function indexAction()
{
$helper = new IgnasHelper();
$profile = $this->profileQuery($helper);
return $this->render(
'IgnasIgnasBundle:Default:index.html.twig',
array('profile' => $profile)
);
}
//method that returns database's data back to main index method
public function profileQuery(IgnasHelper $helper)
{
$em = $this->getDoctrine()->getManager();
$selectAll = array('p.id', 'p.first', 'p.last', 'p.birth', 'p.country', 'p.city', 'p.email');
$profile = $em->createQueryBuilder()
->select($selectAll)
->from('IgnasIgnasBundle:Profilis', 'p')
->getQuery()
->getResult();
return $helper->profileArray($profile);
}
}
现在是Helper班:
public function profileArray(array $profile)
{
$id = $profile[0]['id'];
$first = $profile[0]['first'];
$last = $profile[0]['last'];
$birth = $profile[0]['birth'];
$country = $profile[0]['country'];
$city = $profile[0]['city'];
$email = $profile[0]['email'];
return array(
'id' => $id,
'first' => $first,
'last' => $last,
'birth' => $birth,
'country' => $country,
'city' => $city,
'email' => $email,
);
}
所以对于其他页面,我正在考虑让另一个控制器来执行它。我是否正确使用控制器?
答案 0 :(得分:0)
也许你可以使用Symfony Doctrine Repositories
控制器是针对特定操作而制作的:例如,在博客中,您可以拥有ArticleController,CategoryController等......
您可以在一个控制器中使用多种方法,但如果方法具有相同的主题则更好。
<?php
class CategoryController extends Controller
{
function indexAction() { }
function listArticleAction($catID) { }
function createAction($catID) { }
function renameAction($catID) { }
[...]
}
如果要在profileQuery函数中进行自定义查询,则应该(必须?)使用doctrine存储库。 你可以做出类似
之类的东西<?php
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository("YourBundle:YourEntity");
$list = $repo->whateverYouWantToDo();
使用这种方式有两个主要好处:
- 首先,您不要在错误的地方使用自定义查询来重载控制器
- 第二个是你可以在应用程序的任何地方使用存储库方法(例如在另一个Bundle中)
希望这会对你有所帮助。