SKY / WINGS / THIRD /
MVC1

В SKY Framework один из трех возможных способов построения веб-приложений - MVC, при этом, в деталях, файл с базовыми классами main/mvc.php, построен так, чтобы, код приложений, которые использует его, выглядел максимально просто.

Файл с базовыми классами содержит четыре класса, при этом первый - SKY_MVC является базовым для трех остальных. Это значит, что функционал, который наследуется от него будет доступен и в контроллерах, и моделях. Отовсюду, в коде приложения, имеется доступ к объектам SKY и USER: self::$sky, self::$user, к другим моделям: $this->t_имя_модели или $this->m_имя_модели. Инициализация моделей происходит автоматически, посредством распознавания префиксов t_ или m_ и специальных методов __get() и __set().

Аналогично имеется доступ к глобальным переменным (без объявления их в global) с префиксом: $this->g_..., $this->p_..., $this->c_..., $this->f_... и конфигурационным данным приложения $this->s_...

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

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

Файлы вида, как и при других моделях построения веб-приложений в SKY (не MVC), располагаются в папке view. Контроллеры и модели, располагаются в папке main/mvc. При этом файлы контроллеров имеют префикс c_, а модели t_ или m_. Модели с префиксом t_ соответствуют таблицам в БД. Есть два специальный имени для контроллеров - main/mvc/default_c.php и main/mvc/common_c.php. При осуществлении запросов на сайт, PAGE часть запроса, соответствует имени контроллера, а PVAL имени метода в этом контроллере. Например: PAGE имеет значение "article", а PVAL - "sky", при этом будет вызван метод c_article::c_sky() в файле main/mvc/c_article.php.

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

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

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

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

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

Суммируем: специальные контроллеры: common_c (общий) - может быть вызван перед любым вызовом в контроллерах, default_c - вызывается если определенный контроллер не существует (а этот имеется). Специальные методы: head_c() , tail_c() и empty_c(). Последний заменяет c_(), когда PVAL равен пустой строке, а c_() не следует никогда определять, некрасивое имя.

Переменные для view файлов, определяются в контроллерах и всегда имеют один из префиксов: $v_ или $y_ или $h_. Пример определения переменных для файлов вида в контроллере main/mvc/common_c.php:

001
002
003
004
005
006
007
008
009
010
011
012
class common_c extends SKY_CONTROLLER
{
  function head_c(&$_page, &$_pval) {
    # some controller code
 
    $this->_y = [
      'h_foo' => $foo,
      'v_bar' => $bar,
      'baz' => $baz,
    ];
  }
}

Когда ключ массива имеет один из вышеуказанных префиксов, генерируются переменные без преобразования имени, т.е. $h_foo и $v_bar, при этом для переменных с префиксом h_ дополнительно выполняется функция html(), перед записью в них значений. Если префикс не задан, он добавляется автоматически, для специального контроллера common_c это y_, т.е. последняя переменная в примере будет иметь имя $y_baz.

Во всех остальных контроллерах, массив нужно присваивать не в $this->_y, а в $this->_v, а автоматически добавляемый префикс будет не $y_, а $v_. Обратите внимание: в глобальной области видимости могут быть переменные с префиксом $c_ (куки), отчасти поэтому, авто-префикс в common_c выбран $y_.

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

return 'blog';

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

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

return true;

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

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

return false;

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

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