Comments 7
Форма и action выглядят как адское месиво, может для вас это и удобно, но поддерживать такой код «не очень удобно»
Полностью соглашусь.
Но какой смысл было рефакторить, создавать сервисы для всего этого дела, если задача стояла — максимально просто объяснить, как можно сделать фильтрацию данных из формы?
Вообще, у меня бы это выглядело примерно так — https://gist.github.com/anboo/b01a49240323e5ad44b75c0372dc3810
Можно услышать ваше мнение по-поводу этого?
Но какой смысл было рефакторить, создавать сервисы для всего этого дела, если задача стояла — максимально просто объяснить, как можно сделать фильтрацию данных из формы?
Вообще, у меня бы это выглядело примерно так — https://gist.github.com/anboo/b01a49240323e5ad44b75c0372dc3810
Можно услышать ваше мнение по-поводу этого?
Максимально просто можно было сделать и без месива, как пример:
В контроллере имеем лишь entity-фильтра, форму, пагинатор.
В репозиторий::getList передаем entity-фильтра:
В методе репозитория getList имеем следующее:
И только в applyFilter подстраиваем наш запрос под хотелки фильтра:
При этом форма фильтра у нас чистая. В контроллере нет ничего лишнего. Вся логика расширения DQL запроса хранится в репозитории.
Как-то так.
В контроллере имеем лишь entity-фильтра, форму, пагинатор.
В репозиторий::getList передаем entity-фильтра:
$leadFormFilterEntity = new LeadFormFilterEntity($this->getClock());
$formFilter = $this->createForm(LeadFilterType::class, $leadFormFilterEntity);
$formFilter->handleRequest($request);
$pagination = $this->getPaginator()->paginate(
$leadsRepository->getList($leadFormFilterEntity),
$request->query->get('page', 1),
self::PER_PAGE
);
В методе репозитория getList имеем следующее:
public function getList(LeadFormFilterEntity $leadFormFilterEntity)
{
return new ClosureQuery(
function () use ($leadFormFilterEntity) {
$query = $this
->getQueryBuilder()
->select('COUNT(abstractLead)');
$this->applyFilter($leadFormFilterEntity, $query);
И только в applyFilter подстраиваем наш запрос под хотелки фильтра:
private function applyFilter(LeadFormFilterEntity $leadFormFilterEntity, QueryBuilder $query)
{
if ($leadFormFilterEntity->getLanding()) {
$query
->andWhere('abstractLead.landing = :landing')
->setParameter('landing', $leadFormFilterEntity->getLanding());
}
При этом форма фильтра у нас чистая. В контроллере нет ничего лишнего. Вся логика расширения DQL запроса хранится в репозитории.
Как-то так.
meet.startDate <= '2017-01-31 00:00:00'
Получается встреча в 01-31 01:00:00 не попадет?
Вообще по логике да, в статье чисто пример DQL.
Тут речь скорее о том, что конкретно данные поставляет в обработку с фрондента, в данном случае это была просто форма с datepicker-ом, прибавляем к нему timepicker и у нас все замечательно работает.
В примере с DQL данные проставлялись в формате DATE, а не DATETIME, поэтому время было равно 00:00.
Тут речь скорее о том, что конкретно данные поставляет в обработку с фрондента, в данном случае это была просто форма с datepicker-ом, прибавляем к нему timepicker и у нас все замечательно работает.
В примере с DQL данные проставлялись в формате DATE, а не DATETIME, поэтому время было равно 00:00.
Sign up to leave a comment.
LexikFormFilterBundle, создаем фильтрующие формы еще быстрее