Pull to refresh

Comments 7

UFO landed and left these words here
UFO landed and left these words here
Форма и action выглядят как адское месиво, может для вас это и удобно, но поддерживать такой код «не очень удобно»
Полностью соглашусь.
Но какой смысл было рефакторить, создавать сервисы для всего этого дела, если задача стояла — максимально просто объяснить, как можно сделать фильтрацию данных из формы?
Вообще, у меня бы это выглядело примерно так — https://gist.github.com/anboo/b01a49240323e5ad44b75c0372dc3810
Можно услышать ваше мнение по-поводу этого?
Максимально просто можно было сделать и без месива, как пример:

В контроллере имеем лишь 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.
Sign up to leave a comment.

Articles