Классы для построения MVC приложений

SKY / WINGS / SECOND /
MVC1
По сути MVC является холдером действий (action) и моделей, а класс View обеспечивает очень удобный и универсальный алгоритм подготовки данных для top-view, смотрите VIEW. В SKY Framework базовые классы MVC находятся в файле `main/w2/view.php`. Все построено так, чтобы код приложений, которые используют MVC, выглядел максимально просто.

Файл с базовыми классами содержит четыре класса, при этом первый - Mvc является базовым для трех остальных. Это значит, что функционал, который наследуется от него будет доступен и в контроллерах, и моделях. Отовсюду, в коде приложения, имеется доступ к любым моделям: $this->t_имя_модели или $this->m_имя_модели. Инициализация моделей происходит автоматически, посредством распознавания префиксов t_ или m_ и специальных методов __get() и __set(). Также имеется прямой доступ к конфигурационным данным приложения $this->s_... Если для "табличной модели" достаточно базовых классов, вы можете ее не определять. Автозагрузчик сделает это за вас:

... 't' == $name[0] && eval("class $name extends Model_t {}");

Все обращения к несуществующим свойствам классов, будут переадресовываться в реестр переменных объекта SKY.

В SKY нельзя (не рекомендуется) создавать переменные и свойства классов с одно-буквенным префиксом, если она не имеет специальной логики, связанной с префиксом.

Контроллеры и модели, располагаются в папке main/app. При этом файлы контроллеров имеют префикс c_, а модели t_ или m_. Модели с префиксом t_ соответствуют таблицам в БД. Есть два специальный имени для контроллеров - main/app/default_c.php и main/app/common_c.php. При осуществлении запросов на сайт, PAGE часть запроса, соответствует имени контроллера, а $sky->pval имени метода в этом контроллере. Например: PAGE имеет значение "article", а $sky->pval - "sky", при этом будет вызван метод c_article::a_sky() в файле `main/app/c_article.php`.

Если контроллер main/app/c_article.php не существует, будет произведен поиск метода a_article() в специальном контроллере default_c таким образом: default_c::a_article(). Если контроллер default_c не существует или не существует метод default_c::c_article(), будет автоматически сгенерирована страница 404.

Следует также всегда помнить о специальном методе классов в PHP __call(), если он присутствует в классе, он будет всегда вызываться при обращении к любому неопределенному в классе методе. Такой механизм очень удобен и употребим в SKY Framework, схеме MVC. Если такой класс определен в контроллере main/app/c_article.php, а метод c_article::a_sky() не определен, то будет вызван метод c_article::__call().

Если определен контроллер main/app/common_c.php и в нем определены методы common_c::head_a() и common_c::tail_a(), то стандартная последовательность вызовов методов в контроллерах будет такая: первым вызывается common_c::head_a(), потом (к примеру) c_article::a_sky(), и в конце common_c::tail_a(). Т.е. в общий контроллер common_c, в эти два специальные методы, можно добавить код, который будет вызываться при вызове любого контроллера страниц.

Если в контроллере c_article определен метод c_article::head_a(), то метод common_c::head_a() не будет вызываться (как описано в предыдущем абзаце), и для любого метода с префиксом c_... в контроллере c_article, перед его вызовом будет вызываться метод c_article::head_a(). Все же из контроллера c_article::head_a(), можно вызвать код метода common_c::head_a(), если в его коде сделать вызов parent::head_a().

Таким образом, можно как угодно определять код, который будет исполняться (или не исполняться) при любых вызовах контроллеров, исполняться (или не исполняться) при вызове любых методов одного контроллера и исполняться при вызове определенного контроллера и метода соответствующих PAGE и $sky->pval.

Суммируем: специальные контроллеры: common_c (общий) - может быть вызван перед любым вызовом в контроллерах, default_c - вызывается если определенный контроллер не существует (а этот имеется). Специальные методы: head_a() , tail_a() и empty_a(). Последний заменяет a_(), когда $sky->pval равен пустой строке, но a_() не следует определять, некрасивое имя.

Переменные для view файлов, определяются в контроллерах и всегда имеют один из префиксов: $v_, $y_, $h_, $k_, $e_, смотрите подробнее в узле VIEW.

Возвращаемое значение в контроллерах, может быть null (вообще ничего не пишем) или true, false, или строка. Если возвращаемое значение строка, то она определяет файл центрального тела страницы, например если написать

return 'blog';

то будет вызван файл вида view/_blog.php. Обратите внимание: к имени файла вида всегда добавляется подчеркивание. Это с одной стороны группирует файлы по назначению в папке view (если сортировка по имени, а она базовая) и с другой стороны, напрочь отсекает возможность подняться по иерархии папок в файловой системе вверх, ведь имя файла "_../main/sky.php" никак не подымет вверх по иерархии. Та же логика имеет отношении к файлам в папке main/app.

Если контроллер возвращает:

return true;

то будет отключен и файл $sky->layout и файл страницы $sky->page. Это значит, что вся печать данных в браузер уже произведена в контроллере. Это часто удобно для AJAX запросов. Кстати, при использовании специальной схемы AJAX, чаще и этого делать не нужно. По умолчанию (если обнаружен специальный запрос в GET, например - http://site_addr/index.php?AJAX=page&page=pval, то $sky->layout по умолчанию отключен. Если в контроллере сделано echo .. и выдана не пустая строка, то в $sky->body также автоматически впишется пустая строка и механизм (функция) view, не будет использовать шаблон для body. Может потребоваться написать return true; только, когда, после echo.., в буфере может оказаться пустая строка.

Если указано:

return false;

то отключается только файл layout, в AJAX запросах он никогда обычно не нужен, а предопределенный шаблон для body остается. Это удобно, когда AJAX запрос должен вернуть значительный по объему HTML, его неудобно генерировать прямо в контроллере или требуется работа дизайнера. Тогда HTML для AJAX запроса формируется подобно обычному запросу, но с отключенным файлом layout.

Использование вышеописанных схем позволяет минимизировать количество байт (размер файлов), все выглядит просто.
опубликовано ENERGY - 20 Sep 2015 09:34 GMT
последнее редактирование - 22 Jun 2018 13:22 GMT
 +  0  -  комментировать