Является ли контроллер подходящим местом для такого поведения?
Да.
Как выглядит такое поведение в Symfony2?
Каковы лучшие практики (в Symfony) для решения такого рода проблем?
В Symfony это выглядит примерно одинаково, но есть пара нюансов.
Я хочу предложить свой подход к этому материалу. Начнем с маршрутизации:
# src/Scope/YourBundle/Resources/config/routing.yml
ScopeYourBundle_people_list:
pattern: /people
defaults: { _controller: ScopeYourBundle:People:list, _format: json }
Параметр _format
не обязателен, но позже вы поймете, почему он важен.
Теперь давайте посмотрим на контроллер
<?php
// src/Scope/YourBundle/Controller/PeopleController.php
namespace Overseer\MainBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class PeopleController extends Controller
{
public function listAction()
{
$request = $this->getRequest();
// if ajax only is going to be used uncomment next lines
//if (!$request->isXmlHttpRequest())
//throw $this->createNotFoundException('The page is not found');
$repository = $this->getDoctrine()
->getRepository('ScopeYourBundle:People');
// now you have to retrieve data from people repository.
// If the following code looks unfamiliar read http://symfony.com/doc/current/book/doctrine.html
$items = $repository->findAll();
// or you can use something more sophisticated:
$items = $repository->findPage($request->query->get('page'), $request->query->get('limit'));
// the line above would work provided you have created "findPage" function in your repository
// yes, here we are retrieving "_format" from routing. In our case it's json
$format = $request->getRequestFormat();
return $this->render('::base.'.$format.'.twig', array('data' => array(
'success' => true,
'rows' => $items,
// and so on
)));
}
// ...
}
Контроллер отображает данные в формате, заданном в конфигурации маршрутизации. В нашем случае это формат json.
Вот пример возможного шаблона:
{# app/Resourses/views/base.json.twig #}
{{ data | json_encode | raw }}
Преимущество этого подхода (я имею в виду использование _format) состоит в том, что если вы решите переключиться с json, например, на xml, то это не проблема - просто замените _format в конфигурации маршрутизации и, конечно, создайте соответствующий шаблон. 1029 *