Symfony2:正确使用控制器

时间:2014-04-05 14:38:53

标签: php symfony controller

我正在构建几页应用程序。并想问一下使用控制器的正确方法是什么?

每个页面都有一个控制器?或者将页面作为方法放在同一控制器中?在我的情况下,我正在使用数据库,我真的无法将所有内容保存在一个方法中。在这种情况下,我创建了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,
    );
}

所以对于其他页面,我正在考虑让另一个控制器来执行它。我是否正确使用控制器?

1 个答案:

答案 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中)

希望这会对你有所帮助。