Skip to content
Snippets Groups Projects
README.md 2.77 KiB

Doctrine HTTP Filter

Doctrine HTTP Filter – это PHP-библиотека для создания запросов в Doctrine с учётом параметров выборки, полученных из Symfony Request.

Требования

  • PHP 8.3+
  • Doctrine ORM 3.3+
  • Symfony Http Foundation 7.2+

Использование

Настройка репозиториев Doctrine ORM

Для использования библиотеки необходимо унаследовать репозиторий от HttpFilterEntityRepository.

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\ClassMetadata;
use IQDEV\Packages\DoctrineHttpFilter\HttpFilterEntityRepository;
use App\Entity\Post;

class PostRepository extends HttpFilterEntityRepository
{
    public function __construct(EntityManagerInterface $em)
    {
        parent::__construct($em, new ClassMetadata(Post::class));
    }

    public function getAliasTableForFilter(): string
    {
        return 'p';
    }
}

После этого в репозитории станет доступен метод createQueryByFilter, который принимает набор фильтров и, при необходимости, объект Request.

Пример фильтрации

Для фильтрации используется query-параметр filters из Request.

Набор фильтров представляет собой массив, где ключ – это поле для фильтрации, а значение – тип фильтра.

Ключ фильтрации соответствует ключу из Request и, в случае стандартных фильтров, колонке фильтруемой сущности.

use IQDEV\Packages\DoctrineHttpFilter\Filter\Where;
use Symfony\Component\HttpFoundation\Request;

$filters = [
    'title' => Where::class,
];

// Этот параметр необязательный. В случае null будет собран из Request::createFromGlobals();
$request = new Request([ 'filters' => [ 'title' => 'Example' ]]);

$posts = $postRepository
    ->createQueryByFilter($filters, $request)
    ->getQuery()
    ->getResult();

Roadmap

  • Добавить базовые интерфейсы/классы для работы с фильтрацией
  • Добавить базовые фильтры:
    • Where
    • Like
    • ILike
    • Range
    • In
    • Date
    • DateRange
  • Добавить возможность сортировки
  • Добавить поддержку вендорных и других кастомных реализаций EntityManager вместе с HttpFilterEntityRepository