Skip to content
AntonShevchuk edited this page Oct 14, 2014 · 32 revisions

Описание

Наше приложение, некий God Object

Настройка

Начинаем все с document root'a, вот вам пример .htaccessskeleton он уже есть), с его помощью все запросы будут заворачиваться на index.php:

# setup environment
# for mixed configuration app.BLUZ_ENV.php with application.php
SetEnv BLUZ_ENV production
SetEnv BLUZ_DEBUG_KEY debug
 
Options +FollowSymlinks
Options -Indexes
 
<IfModule mod_rewrite.c>
 
RewriteBase /public/
RewriteEngine On
 
# loop stopping
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
 
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_URI} ^/(css|scripts|images|uploads) [OR]
RewriteCond %{REQUEST_URI} \.(jpe?g|png|gif|ico)$
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
 
</IfModule>

А вот и пример index.php взятый из skeleton:

// public/index.php

// Require loader
require_once '_loader.php';

// Debug mode for development environment only
define('DEBUG_KEY', isset($_SERVER['BLUZ_DEBUG_KEY'])? $_SERVER['BLUZ_DEBUG_KEY']:'debug');

if (isset($_COOKIE[DEBUG_KEY])) {
    define('DEBUG', true);
    error_reporting(E_ALL | E_STRICT);
    ini_set('display_errors', 1);
} else {
    define('DEBUG', false);
    error_reporting(0);
    ini_set('display_errors', 0);
}

// Shutdown function for handle critical and other errors
register_shutdown_function('errorHandler');

// iframe header - prevent security issues
header('X-Frame-Options: SAMEORIGIN');

function errorHandler() {
    $error = error_get_last();
    if (!is_array($error)
        || !in_array($error['type'], array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR))) {
        return;
    }
    require_once 'error.php';
}

// Try to run application
try {
    // init loader
    require_once PATH_LIBRARY . '/Bluz/_loader.php';
    require_once PATH_APPLICATION . '/Bootstrap.php';

    // Environment
    $env = isset($_SERVER['BLUZ_ENV'])? $_SERVER['BLUZ_ENV']:'production';

    /**
     * @var \Application\Bootstrap $app
     */
    $app = \Application\Bootstrap::getInstance();
    $app->init($env);
    $app->process();
    $app->render();
    $app->finish();
} catch (Exception $e) {
    require_once 'error.php';
}

Создаем симлинку на public либо изменяем baseUrl в конфигурационном файле и .htaccess. И запускаем скрипт install.sh

Диспетчеризация

Входная точка приложения - файл index.php, в данном файле происходит создание экземпляра класса Application\Bootstrap и его инициализация для текущего окружения. Данный класс может расширить функционал абстрактного класса Bluz\Application.

Инициализация

  • вытягивает конфигурацию текущего окружения с использованием пакета Config
  • устанавливаем значение флага отладки согласно конфигурации Config::getData('debug')
  • устанавливаем php настройки согласно конфигурации Config::getData('php')
  • инициализация сессии Session (стартует только в случае наличия куки PHPSESSID)
  • инициализация сообщений Messages (проверяется, не остались ли сообщения с прошлого запроса)
  • инициализация системы переводов интерфейса Translator (локаль и всё такое)
  • инициализация объекта Request - $this->initRequest()
    • по умолчанию инициируется Http\Request
    • проверяем запрос на причастность к XmlHttpRequest, при положительном результате отключаем Layout - вызываем $this->useLayout(false)
    • проверяем заголовок accept на принадлежность к application/json и при положительном исходе переключаем на вывод в JSON - используя метод $this->useJson(true)
  • инициализация объекта Response - $this->initResponse()
    • по умолчанию инициируется Http\Response
  • инициализация объекта Router

Процесс

  • запускается маршрутизация, а так же модифицируем Request объект согласно входящему запросу
  • запускаем dispatch() конкретного контроллера:
    • хук preDispatch()
      • проверяется доступ согласно Bluz\Acl
    • вызов doDispatch()
      • проверяется метод доступа к контроллеру
      • проверяем попадание по @cache-html
      • проверяем попадание по @cache
      • еще раз перетираем параметры Request по текущим параметрам (могут отличаться) и согласно данным из рефлексии
      • инициализируем View контроллера
      • подключаем bootstrap.php данного модуля, если таковой есть
      • подключаем контроллер
      • запускаем функцию контроллера
      • обрабатываем ответ контроллера (описание можно найти на странице контроллера)
    • хук postDispatch()
  • закидываем ответ контроллера внутрь Bluz\Response с использованием метода setBody()
    • проверяем результат на принадлежность к RedirectException и устанавливаем заголовки
    • проверяем результат на принадлежность к ReloadException и устанавливаем заголовки
    • если поймали иное исключение, то система отрабатывает контроллер error/index (по умолчанию)
    • если у нас включен Layout, то ответ контроллера закидывается как контент, и уже Layout передаётся в Response

Вывод

Вывод для Http\Response запросов происходит по следующему сценарию:

  • варианты вывода
    • проверка JSON флага, добавление заголовков и приведение контента к JSON формату:
      • данные из Bluz\Messages добавляются в заголовки
      • данные активного контроллера пакуются в JSON формат

Вывод для Cli\Response происходит по следующему сценарию:

  • вывод данных активного контроллера как набора ключ:значение

Завершение работы

За завершения отвечает метод finish(), на данный момент служит лишь для логирования.

Использование

Методы для инициализации пакетов фреймворка:

Ещё методы:

  • getEnvironment() - возвращает текущее окружение
  • getPath() - возвращает путь к приложение на файловой системе
  • isDebug() - проверяет на debug режим

Методы для работы с выводом:

  • useLayout($flag) - вкл/выкл Layout
  • useJson($flag) - вкл/выкл вывод в формате JSON (все данные из View будут закинуты в JSON)
  • hasLayout() - проверка использования Layout
  • isJson() - проверка режима вывода в JSON

Application Helpers

reload

Перезагрузка текущей страницы - применяется для предотвращения сообщения о повторной отправки данных посредством POST. Для AJAX запросов так же срабатывает, для них будет отправлен заголовок Bluz-Reload: true

Синтаксис:

app()->reload(); // anywhere
$this->reload(); // inside controller closure

redirect

Перенаправление на заданный URL - работает как для обычных, так и для AJAX запросов, для них будет отправлен заголовок Bluz-Redirect: $url

Синтаксис:

app()->redirect($url); // anywhere
$this->redirect($url); // inside controller closure

redirectTo

Перенаправление на заданный контроллер.

Синтаксис:

app()->redirectTo($module, $controller, $params); // anywhere
$this->redirectTo($module, $controller, $params); // inside controller closure

user

Возвращает текущего пользователя, если таковой есть.

Синтаксис:

app()->user(); // anywhere
$this->user(); // inside controller closure

Clone this wiki locally