Для моего проекта Symfony2 я бы хотел придерживаться подхода Fat Model Skinny Controller. У меня все работает, однако в моем контроллере много дублирования / ненужной бизнес-логики. Какой самый лучший подход к уборке?
Контроллер
<?php
namespace TestApp\PeopleBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class PeopleController extends Controller {
public function indexAction() {
return $this->render('TestAppPeopleBundle:People:index.html.twig');
}
public function loadAction() {
$repository = $this->getDoctrine()->getRepository('TestAppPeopleBundle:People');
$request = $this->getRequest();
$parsedFilters = array();
$extFilterParser = $this->get('ext_filter_parser');
$filters = $request->query->get('filter');
if(empty($filters) === FALSE) {
$parsedFilters = $extFilterParser->setFilters($filters)->parse()->getParsedFilters();
}
$format = $request->getRequestFormat();
$people = $repository->getListOfPeople($parsedFilters);
$data = array('success' => true, 'people' => $people);
return $this->render('::base.'.$format.'.twig', array('data' => $data));
}
public function exportGridAction($format) {
$repository = $this->getDoctrine()->getRepository('TestAppPeopleBundle:People');
$request = $this->getRequest();
$parsedFilters = array();
$extFilterParser = $this->get('ext_filter_parser');
$filters = $request->query->get('filter');
if(empty($filters) === FALSE) {
$parsedFilters = $extFilterParser->setFilters($filters)->parse()->getParsedFilters();
}
$format = $request->getRequestFormat();
$people = $repository->getListOfPeople($parsedFilters);
$grid = $request->get('grid');
return $this->render('::extgrid.'.$format.'.twig', array('grid' => $grid, 'data' => $people));
}
}
Хранилище сущностей (люди)
<?php
namespace TestApp\PeopleBundle\Repository;
use Doctrine\ORM\EntityRepository;
/**
* PeopleRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class PeopleRepository extends EntityRepository {
public function getQbForListOfPeople(array $filters) {
$queryBuilder = $this->createQueryBuilder('p');
$queryBuilder->select('p.id', 'p.firstName', 'p.lastName', 'p.dateOfBirth', 'p.address', 'p.city', 'p.state', 'p.zipCode');
foreach($filters as $filter) {
$queryBuilder->andWhere('p.' . $filter['expression'] . ' ' . $filter['value']);
}
$queryBuilder->setMaxResults(50);
return $queryBuilder;
}
public function getListOfPeople() {
return $this->getQbForListOfPeople(array())->getQuery()->getResult();
}
}
Моя мысль заключалась в том, чтобы поместить логику для разбора фильтров из $ _GET или $ _POST внутри хранилища, но хранилище не имеет доступа к объекту запроса, как контроллер.
Моя вторая мысль заключалась в том, чтобы поместить логику для разбора фильтров из $ _GET или $ _POST внутри службы ExtFilterParser, но у службы нет доступа к объекту запроса, как у контроллера.