Фільтрування даних у Symfony

Фільтрування даних у Symfony

Всім любителям Symfony відомо що в ній немає компонента фільтр.


Є чудові і зручні Constraints і навіть була спроба створити на подобі їх фільтри issue на Github, але ніхто так і не взявся це зробити.

Когда я в очередной раз столкнулся с задачей фильтрации большого количества данных, полученных от пользователя, я понял что пора решить задачу фильтрации как то более глобально/красиво/удобно.

Провівши якийсь research я зрозумів що нічого кардинально нового у фільтруванні на php не з'явилося. Є 2 популярні компоненти:

  • Zend Filter
  • DMS-Filter

Прошу зауважити що останній не зовсім добре підтримується автором.

Для DMS-Filter є symfony bundle але він не сумісний з Symfony 3. Та й код його не сподобався, так як я розумів що можна зробити все трохи простіше.

Проаналізувавши ситуацію, я зрозумів що найшвидший і надійний спосіб написати bundle для фільтрації який буде використовувати добре документовані і покриття тестами фільтри з Zend Filter. Так само хочу додати що в минулому я багато працював з Zend Framework 1 і мені вони були близькі і зрозумілі.

Мені хотілося зробити логіку роботи фільтрів на подобі Symfony Constraints.

У підсумку було написано bundle, що додає сервіс, який можна використовувати для фільтрації об'єкта на основі анотацій. Крім того, bundle може фільтрувати форми, якщо він знаходить анотований об'єкт.

У процесі написання додатка складнощів не виникло. Ось розділи документації, які я використовував під час написання:

  • How to Create a Form Type Extension
  • Form Events
  • How to Dynamically Modify Forms Using Form Events
  • How to Register Event Listeners and Subscribers

Мені здається не варто детально описувати як користуватися bundle в даній публікації так як вона більше пояснює навіщо я його написав. Та й дивно просто копіювати інформацію з одного місця в інше.

Документацію з використання bundla і сам bundle ви можете знайти на GitHub FilterBundle.

Хотів би дізнатися у спільноти, а як ви вирішуєте завдання щодо фільтрації в Symfony?