Несколько примеров кастомных Element Select в Zend Framework 2

Когда идет работа с формами часто необходимо делать не совсем стандартные селекты.
В данном посте я рассмотрю несколько примеров таких селектов и так же ObjectSelect от .

В общем случае код кастомного селекта выглядит так. Далее пример общего кода и пример первого селекта.

Все, кроме метода configureWithData() является стандартным кодом.
Сам метод в данном лучае использует перечисление Enum, которое я описывал в посте Эмуляция перечислений Enum в PHP

Само перечисление выглядит так.

Очень просто и понятно. Если предположить, что на весь проект задан стандартный набор статусов и любая модель может использовать эти статусы — очень удобно делать выборку таким селектом по статусам.
В форме это инициируется так.

Теперь пример номер 2. В нем весь код, кроме названия селекта и метода конфигурирования идентичен.

В примере номер 2 мы будем заполнять данными полученными с внешнего api. Даные получаются в json формате, специальная обертка процессит их в массив. Так же в обертке вшит способ отправки. По сути это Proxy. Используется в форме он так же, как и пример 1. В классе селекта следующий код.

Как видно закоментирован прямой вызов обертки и вызывается некий статический метод getCachedInstance(). Внутри реализован паттерн кеширования object из набора паттернов Zend 2. В качестве хранилища указан APC. Сделано это чтобы не слать запрос при каждом обновлении формы.

Третий пример это select который заполняет сам себя из базы данных используя Doctrine.

Можно реализовать такой select вручную с помощью инъекции EntityManager. Приведу полный код

И в форме вызывается так-же. Кстати тут тоже можно добавить кеширование.

Как видно из кода минус в том, что в форму тоже надо делать инъекцию EntityManager и в данном случае лучше делать это через конструктор формы.

Если же использовать реализацию от Doctrine, то тут отпадает необходимость в своем классе Select, но инъекцию EntityManager в форму делать все равно надо.
Вот тот же RoleSelect только через Doctrine\ObjectSelect

Комментарий оставлен, чтобы было понятно. Так же Doctrine позволяет использовать свой репозиторий для заданного в селекте Entity. Для этого в конфиге надо указать специальные параметры и имя метода из репозитория.

Подробнее в этом посте.

Создание своих \Select подобным образом может значительно повысить повторное использование кода и облегчить поддержку.
Так же можно комбинировать свои селекты со своим рендерингом, как это описано в этом посте — Свой Form Element со своим Render в Zend Framework 2