Идея, родившаяся в процессе разработки собственной CMS. Часто нужно, чтобы одни и те же события были доступны одновременно через основной html вид, через ajax, или, к примеру, через мобильный телефон. Естественно, может понадобиться не только вывести данные в разных форматах(html, JSON, xml), но и выполнить дополнительные действия в зависимости от среды.
Можно реализовать это с помощью условий в отдельном методе контроллера, можно с помощью отдельных методов для каждого типа отображения, а можно так…
Идея заключается в разделении классов контроллеров по способу отображения.
Т.е. создаём основной контроллер, в котором реализуются дефолтные методы для обработки событий.
Дальше, для каждого типа отображения создаём контроллер, наследника основного контроллера, и реализуем открытые методы для событий, которые доступны в данном типе. Или делаем заглушки для методов, которые недоступны.
К названию классов этих контроллеров добавляем префикс (или постфикс) в соответствии с типом. Например: IndexController_Web, IndexController_Ajax, IndexController_Mobile и т.п.
Дальше, во фронт контроллере определяем в какой среде работает скрипт и какой префикс необходимо использовать и вызываем контроллеры с нужным префиксом. Если нужный класс не существует, подгружаем родителя, таким образом будут доступны все методы по умолчанию.
Есть вариант реализовать в родительском контроллере только protected методы, реализующие действия, общие для всех типов или возвращающие данные в общем формате. Тогда в наследниках можно описывать только доступные методы, а ненужные методы будут недоступны по умолчанию.
Плюсы такого подхода:
Минусов пока не нашёл)
Думаю, этот подход можно применить и в существующих CMS типа Zend Framework, проведя небольшие изменения в ядре или с помощью плагинов.
Можно реализовать это с помощью условий в отдельном методе контроллера, можно с помощью отдельных методов для каждого типа отображения, а можно так…
Идея заключается в разделении классов контроллеров по способу отображения.
Т.е. создаём основной контроллер, в котором реализуются дефолтные методы для обработки событий.
Дальше, для каждого типа отображения создаём контроллер, наследника основного контроллера, и реализуем открытые методы для событий, которые доступны в данном типе. Или делаем заглушки для методов, которые недоступны.
К названию классов этих контроллеров добавляем префикс (или постфикс) в соответствии с типом. Например: IndexController_Web, IndexController_Ajax, IndexController_Mobile и т.п.
Дальше, во фронт контроллере определяем в какой среде работает скрипт и какой префикс необходимо использовать и вызываем контроллеры с нужным префиксом. Если нужный класс не существует, подгружаем родителя, таким образом будут доступны все методы по умолчанию.
Есть вариант реализовать в родительском контроллере только protected методы, реализующие действия, общие для всех типов или возвращающие данные в общем формате. Тогда в наследниках можно описывать только доступные методы, а ненужные методы будут недоступны по умолчанию.
Плюсы такого подхода:
- Проверка типа осуществляется только один раз во фронт контроллере и нет необходимости каждый раз проверять условия работы скрипта
- Код чётко разделён и не захламляется
- Доступ по одному и тому же url'у в разных средах
- Возможность легко закрыть ненужные методы
Минусов пока не нашёл)
Думаю, этот подход можно применить и в существующих CMS типа Zend Framework, проведя небольшие изменения в ядре или с помощью плагинов.