MVC структура SKY приложений

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

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

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

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

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

Все контроллеры должны наследовать класс `Controller`, табличные модели класс `Model_t`, другие модели класс `Model_m`. Если существует класс хуков, он должен наследовать класс `Hook_base`.

Файлы в папке `app`


Файл или методОписание
c_<contr-name>.phpтипичный контроллер. <contr-name> соответствует PAGE
c_main.phpчастный случай контроллера, контроллер главной страницы, когда PAGE равно пустой строке. Кроме обработки запроса главной страницы сайта, в него рекомендуется помещать обработку CSN-AJAX, которые не "привязаны" к родительской странице (родительскому контроллеру), т.е. ajax запросы которые могут быть вызваны с произвольных страниц.
common_c.phpобщий контроллер, обычно содержит код генерации переменных для MASTER-layout в common_c::tail_a(), а также actions (методы) для SUB-VIEW, которые могут быть вызваны из разных мест (страниц)
default_c.phpконтроллер по умолчанию, содержит actions, для которых выделять отдельный файл контроллера слишком расточительно. Если определить default_c::__call(..), то абсолютно все "другие" вызовы активируют этот метод. Но этот метод можно и не определять, тогда для всех таких вызовов будет автоматически сгенерирована страница 404
t_<table-model>.phpтабличная модель, наследует функционал базового класса для работы с таблицами в БД
m_<just-model>.phpне табличная модель
hook.phpкласс хуков, позволяет изменять поведение ядра SKY Framework

Методы контроллеров


a_<action-name>()<action-name> - имя action соответствует $sky->val (или PAGE для контроллера default_c.php), не имеет смысла для common_c.php
j_<action-name>()аналогично но для CSN-AJAX вызовов
empty_a()метод, выполняющийся, когда $sky->val равно пустой строке, т.е. вместо a_()
empty_j()аналогично но для CSN-AJAX
head_a()общий метод контроллеров, выполняющийся перед всеми основными action в пределах контроллера. Если head_a() не определен, или имеется вызов parent::head_a(), то common_c::head_a() будет выполняться перед любыми вызовами в любые такие контроллеры. Для детального понимания смотрите код View::top() в файле `main/w2/view.php`
tail_a()аналогично, но выполняющийся после основных action
__call()магический метод PHP. Может активно использоваться. "Улавливает" все "остальные" вызовы в контроллер
x_<action-name>()<action-name> - имя action для SUB-VIEW (вспомогательного). Например в шаблонах можно написать @view(<action-name>)
r_<action-name>()<action-name> - имя action для SUB-VIEW, включающего функционал RED-LABEL

Ход обработки запросов HTTP


На рисунке 1 ниже, показана последовательность исполнения методов в контроллерах. Если метод head_a() определен, он выполняется первым, далее главный метод контроллера и в завершении tail_a(..). Если в методах head_a() и tail_a(..) нет вызовов родительских методов, то код общего контроллера не вызывается вовсе. На рисунке 2 показана типичная последовательность выполнения методов в контроллерах с генерацией переменных для MASTER-layout, здесь указанные методы просто не определены в главном контроллере. Схема на рисунке 1 удобна для создания, например массива SVG картинок или RSS потоков или создания визуализации для печати на принтере. Вторая схема - типична для создания страниц сайта. CSN_AJAX запросы располагаются в контроллерах вместе с обычными запросами, но для них, как правило, не нужно готовить переменные для MASTER-layout, поэтому в начале метода common_c::tail_a(), обычно резонно написать:

001
002
003
004
<?php
if (!View::layout())
     return;
 




Действия "action SUB-VIEW" могут быть вызваны из файлов представлений, с помощью инструкции Jet @view(..). Вызовы методов контроллеров из представлений, могут также происходить при использовании итераторов Jet (на основе переменных с префиксом $e_). Действия "action SUB-VIEW", могут быть составной частью обработки запросов в TOP-VIEW. Все эти механизмы предоставляют простые и богатые возможности для организации сложных отображений.

Возвращаемые методами контроллеров значения


значениеметодописание
404все специальные методыгенерация станицы 404 - не найдено
<string>head_a()смена контроллера. Например запрос http://example.com/user запустил контроллер c_user.php, в нем функция head_a() возвратила строку "people" - это прекратит выполнение в текущем контроллере и активирует контроллер c_people.php, своеобразный роутинг
<string>a_some_act(), j_some_act()устанавливает шаблон <string>, например, для `list` подключится шаблон Jet view/_list.php
<string>tail_a()устанавливает layout <string>, например, для `svg` подключится layout Jet view/y_svg.php
<array>tail_a(), head_a()установка переменных для View::$y_ - layout, массив дополняется
<array>a_some_act(), j_some_act()установка переменных для View::$v_ - body, массив дополняется
TRUEвсе специальные методыотключит предустановленные `body` и `layout` для методов с префиксом a_
NULL или отсутствие returnвсе специальные методыничего не меняет


Переменные View::$v_ и View::$y_ можно заполнять и явно, присваивая или дополняя (используя оператор +=) массивы. Layout можно также явно установить написав View::layout('new_layout');. На самом деле, чаще всего будет удобно возвратить массивы из методов common_c::head_a() и common_c::tail_a(), а сменить предустаовленную layout, возвращением строки из c_somecontr::tail_c(..).

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

При CSN-AJAX, по умолчанию, layout и body не используются, а вовремя обычных запросов layout настроена на файл `view/y_desktop.php` или `view/y_mobile.php`, а body соответствует имени контроллера, например, в контроллере c_list.php, body по умолчанию равно `list`, т.е. будет использован файл view/_list.php.

Если в контроллере сделан вывод в STDOUT с помощью echo, и выдана не пустая строка, то в $sky->body  автоматически впишется пустая строка и механизм view, не будет использовать шаблон для body.
published ENERGY - 20 Sep 2015 09:34 GMT
last edit - 24 Oct 2018 10:52 GMT
 +  0  -  add comment