Урок 2. Базовые контроллерыНачнем имеено с контроллеров потому, что большинство проектов из тех, что я видел, имеют проблему именно с ними. Весь их функционал собран в лучшем случае в одном базовом контроллере, а в худшем вообще дублируется в каждом контроллере. Как результат проблемы при модернизации и необходимость писать много рутинного кода.
Создадим для нашей CMS набор базовых контроллеров, размещенных в модуле common, содержащем общий для всех приложений функционал.
Они будут наследоваться контроллерами приложений, это обеспечит общую "базу" для всех частей системы.
Необходимо реализовать генерацию путей к файлам, связанных с контроллером (Виды, конфиги, переводы) для их авто загрузки.
Путь к файлу(или ИД записи в БД) можно создавать на основе имени класса-контроллера - Controller_Widget_News `/widget/news` или по данных запроса(request) - `$request->directory().'/'.$request->controller().'/'.$request->action()`.
Также стоит добавить вспомогательные параметры и методы-обёртки которые упростят процесс написания кода, например:
Код:
public function session($group = NULL)
{
return Session::instance($group);
}
Они аналогичны методу redirect класса Kohana_Controller и не идут в разрез с концепцией MVC т.к. непосредственно в них работа с данными не производится.
Учесть все возможные нюансы слишком сложно, поэтому стоит принять ряд допущений, облегчающих работу, например:
- Пути и структура CMS аналогична структуре данных дистрибутива и урока 1 (и последующих уроков)
- Конфиги/Виды/переводы (пока что!) загружаются из файлов
- Контроллеры могут иметь персональные Виды, конфиги и переводы(i18n) по адресу: `директория/контроллер` (`widget/news`, `page/news` , 'ajax/news')
- Контроллеры страниц могут иметь дополнительные файлы Видов, конфигурации и перевода по адреcy: `директория/контроллер/экшен` (`page/news/list`, `page/news/add`)
- Модели могут иметь персональные конфиги, переводы(i18n) и сообщения(message) по адресу: `model/имя_модели`.
- Подключены модули Kohana: auth, cache, database, orm. А также ряд сторонних: assets, message, email и собственно сам common
(ссылки на них будут позднее)
- Основные конфиг группы контроллеров: site(общие настройки), meta_tags, contacts(email, телефон, icq и т.д.), assets(js,css), breadcrumbs(навигационная цепочка), paginate(постраничная навигация)
- В последующих уроках список допущений может быть расширен или скорректирован
Список контроллеров, их назначение и функционал:
Controller_Basic extends Controller - БазовыйНаследуется остальными, поэтому логично добавить вначале аутентификацию\авторизацию т.к. если пользователь не пройдет проверку, то дальнейшее выполнение не имеет смысла.
Также стоит разместить здесь авто загрузку конфигурации контроллера.
Для удобства добавить параметры и методы-обертки для работы с данными запроса, сессией, кешем, конфигурацией и т.д.
Controller_Ajax extends Controller_Basic - AJAX запросЛогично вначале проверять тип запроса(is_ajax) и данных ответа т.к. в случае ошибки, то дальнейшее выполнение не имеет смысла.
Нужно добавить HTTP заголовки(headers), чтобы не было проблем c результатом(отключить кеш, задать тип данных).
Желательно добавить авто конвертацию результата в нужный формат(html\json\xml).
Controller_Layout extends Controller_Basic - База для визуальных контроллеровНужно реализовать кещирование контента, при наличии кеша можно пропустить выполнение action и возможно before\after.
Виды(View) должны загружаться автоматически, кроме тех случаев, когда он задаются вручную.
При внешнем вызове (если он разрешен) результат "оборачиваем" в Вид(View) `layout/skeleton`(каркас html документа).
Т.к. на его основе строятся виджеты и страницы, использующие js\css, желательно подключить assets модуль для объединения и минимизации их контента.
Controller_Widget extends Controller_Layout - ВиджетВиджет — это небольшой информационный блок, размещенный в основном шаблоне страницы. Обычно он содержит данные или сервис другого сайта, например, новости, последние сообщения на форуме, случайный анекдот и т.д.Отличия от Controller_Layout минимальны: используется только один action метод - action_index или его алиас - action.
Controller_Page extends Controller_Layout - Страница\РазделИспользует 2 Вида: один содержит непосредственно контент страницы, а второй - шаблон, в который оборачивается контент. В данном шаблоне размещаются виджеты и сниппеты. Т.к. большинство страниц (а иногда и все) используют один и тот же шаблон, то его имя задается только вручную. Для frontend Я обычно использую 3 шаблона: для главной, для ошибок и общий - для всех остальных.
Сниппет — небольшой фрагмент html текста, пригодный для повторного использования. Они обычно используются для более лёгкой читаемости кода, который без их использования выглядит слишком перегруженными деталями, или для устранения повторения одного и того же общего участка кода.Желательно сделать кеширование конфигурации, чтобы сразу загружать из кеша объединенный вариант вместо нескольких конфиг файлов.
https://github.com/WinterSilence/kohana ... roller/CMS