Zend Framework 2 Paginator без Zend MVC

Представим проект, который либо не использует фреймворки, либо к нему подключена ORM , но у используемого фреймворка/проекта нет адаптера для пагинации с Doctrine.

Но в один прекрасный момент пагинация становится нужна. И нужна она именно для Doctrine результата, ведь именно ее вы используете для работы с БД.
Для меня таким проектом стал проект на , который я поддерживаю. Отсутствие в этом фреймворке таких необходимых вещей, как адаптер для Doctrine и делает его устаревшим. Я использую модуль, который был вынужден допиливать сам (при чем не мало так), а мои pull request автор оригинального модуля даже не смотрит. Сообщество Kohana почти не существует. Вы один на один со своими проблемами в Kohana.
Но тут не об этом.

Этот пост можно было бы назвать еще так:

Вывод пагинации Doctrine используя Zend в Kohana

И так, мне надо вывести пагинацию результата Doctrine, и для этого я вынужден подключать компоненты Zend. Добавляю в composer опытным путем, пока разбирался, следующие компоненты:

Стоит пояснить, что сам Zend Paginator не может работать без Zend View, иначе как он будет рендерить шабло пагинации? Ну а Zend Filter был нужен при исполнении, где-то используется filter chain.

Далее я подключил следующие пространства имен в контроллер Kohana:

ArrayAdapter использовался для тестов, в примерно таком виде.

Т.е. мы не будем делать findAll() и потом уже пытаться разбить весь огромный результат на страницы, мы же не дураки, верно? :)
Тут я хотел бы передать привет одному китайскому парню, чья статься в блоге помогла мне.

Далее ArrayAdapter был заменен на адаптер Doctrine. Ниже я привожу весь остальной код контроллера.

В оригинале в ZF2 пагинация выводится через View Helper метод, вот пример из документации.

Я не стал им пользоваться, иначе надо было бы инициализировать как-то View Helper и передать его в Kohana View. Но все равно внутри компонентов Zend использует PaginationControl, следовательно установка шаблона пагинации идет через него.
Сначала я пробовал передать напрямуб в него путь к шаблону, но эт оприводило к ошибке и это не верный путь.
Для рендеринга php шаблонов phtml используется класс View\PhpRenderer. Но что бы найти нужный шаблон он пользуется услугами класса View\Resolver\TemplateMapResolver. Именно поэтому я передал в него карту шаблонов, обозвал его и передал в PhpRenderer.
Тепеь в PaginationControl мы можем использовать alias шаблона.

Далее я получаю Doctrine\Orm\Query из репозитория, без параметров, т.к. ищу все. Вот этот код находится у меня в базовом репозитории:

Его я и вызываю для получения Doctrine Adapter с уже построенным запросом, чтобы передать его в Zend Paginator.

Нижу идет код, в котором происходит настройка пагинации и в качестве View для пагинации мы устанавливаем настроенный PhpRenderer. В Zend MVC делаются все эти действия, но мы же не пользуемся им..
В конечном итоге я просто передаю экземпляр Paginator в view и вывожу его.

И да, я использую bootstrap. У меня уже был шаблон для bootstrap пагинации в Zend проекте, я скопировал его, удалил все упоминания $this->route (т.к. нет MVC) и он вполне подошел.
Вот код шаблона views/paginator.phtml.

 

UPD:

Приведенный выше вариант шаблона для пагинатора имеет недостатки

1) что если у нас страница должна иметь вид /page-:page/ (так настроен роут Segment)
2) что если у нас в GET есть еще параметры, например сортировка?

Чтобы сделать для варианта с GET нужен такой код:

 

Ну а для варианта с параметром надо поменять мержи $query на $params в шаблоне

В контексте Zend 2 для установки query делаем так в шаблоне

В других случая надо установить в Paginator соответствующие опции.