-
Notifications
You must be signed in to change notification settings - Fork 2
Description
По адаптеру - мне конечно не очень нравится идея выносить SQL-запросы в адаптер пагинации. По моему, лучше бы было, если бы в сервисе поиска были методы получения количества и результатов, и далее они бы как-нибудь передавались в пагинатор (например, через
FixedAdapter). То есть по моему, это задача сервиса поиска - искать данные или определять их количество, а не пагинатора. Задача пагинатора только рассчитывать и помогать с выводом номеров страниц.Также, Сфинкс умеет за один запрос делать поиск и вычислять количество результатов (
SHOW META LIKE). Это можно было бы использовать в описанном мной варианте - сделать метод, который возвращает сразу результаты и общее количество, и далее они передаются в пагинатор. Это может выглядеть например, так:class SearchService { // вместо NO_LIMIT можно бы использовать \INF, но она не попадает в диапазон int public function search(string $query, int $limit = SearchService::NO_LIMIT, int $offset = 0): SearchResult {} } // Напоминает SearchAdapter, при желании можно даже реализовать тут его интерфейс class SearchResult { public function getTotalCount(): int {} public function getOffset(): int {} // не обязательно, но может пригодиться при выводе public function getLimit(): int {} public function getResults(): array {} } class SearchResultItem { public $post; // можно сделать и методами public $snippet; }Еще один маленький подвох - возможно (хоть и маловероятно), что по каким-то причинам пост есть в индексе, но его нет в базе. Такие посты можно пропускать, хоть они и приведут к уменьшению числа результатов на странице.
Касательно пагинации - конечно, наш SphinxAdapter не переиспользуемый. Адаптер должен конвертировать один интерфейс другой и ничего более. Вот тут whiteoctober/Pagerfanta#218 пример получше, но его не вмерджили из-за отсутствия тестов. Ну и он не использует
SHOW META LIKEНапоминает SearchAdapter, при желании можно даже реализовать тут его интерфейс
Нужно его и реализовать, благодаря этому результат можно пагинировать и использовать код библиотеки Pagerfanta для формирования HTML, а не велосипедить. Pagerfanta уже используется для пагинации данных из БД.
Можно ещё заморочится с тем, чтобы SearchService ничего не знал про Pagerfanta - из SearchService возвращаем SearchResult, потом его адаптируем для Pagerfanta, но у нас не библиотека для всеобщего использования и думаю можно сделать по-простому:
use Pagerfanta\Adapter\AdapterInterface; class SearchService { // возвращаем SearchResult, реализующий AdapterInterface public function search(string $query, ...): AdapterInterface }