Skip to content
Anton edited this page Feb 25, 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)
        ->process();
    $app->render();
    $app->finish();
} catch (Exception $e) {
    require_once 'error.php';
}

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

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

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

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

  • вытягивает конфигурацию текущего окружения $this->getConfig($environment)
  • устанавливаем значение флага отладки согласно конфигурации $this->getConfigData('debug')
  • инициализация сессии $this->getSession() (стартует только в случае наличия куки PHPSID)
  • инициализация системы переводов интерфейса $this->getTranslator()
  • инициализация настроек БД $this->getDb() (соединение происходит при первом обращении к БД)

Процесс

  • инициализация объекта Bluz\Request: $this->getRequest()
  • инициализация объекта Bluz\Router, а так же модифицируем Request объект согласно данных маршрутизации
  • проверяем заголовок accept на принадлежность к application/json и при положительном исходе переключаем на вывод в JSON (используя метод $this->useJson(true))
  • запускаем диспатч конкретного контроллера:
    • бросается событие dispatch
    • берётся рефлексия от контроллера
    • проверяется доступ согласно Bluz\Acl
    • проверяется метод доступа к контроллеру
    • проверяем попадание в Bluz\Cache
    • еще раз перетираем параметры Request по текущим параметрам (могут отличаться) и согласно данным из рефлексии
    • инициализируем View контроллера
    • подключаем bootstrap.php данного модуля, если таковой есть
    • подключаем контроллер
    • запускаем функцию контроллера
    • обрабатываем ответ контроллера (описание можно найти на странице контроллера)
  • инициализация объекта Bluz\Response: $this->getResponse()
  • закидываем ответ контроллера внутрь Bluz\Response с использованием метода setBody()

Вывод

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

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

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

  • вывод данных из Bluz\Messages
  • вывод данных активного контроллера

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

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

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

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

  • getAcl() - [Acl]
  • getAuth()
  • getCache()
  • getConfig()
  • getDb()
  • getEventManager()
  • getMailer()
  • getMessages()
  • getLayout()
  • getLogger()
  • getRegistry()
  • getRequest()
  • getResponse()
  • getRouter()
  • getSession()
  • getTranslator()
  • getView() - создаёт новый экземпляр класса View для передачи его внутрь контроллера.

Ещё методы:

  • getPath() - возвращает путь к приложение на файловой системе
  • getConfigData($section, $subsection) - возвращает конфигурацию системы, можно указать конкретный узел
  • hasMessage() - проверяет был ли инициализирован пакет Messages
  • log($message) - системное логирование

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

  • useLayout($flag) - вкл/выкл Layout
  • useJson($flag) - вкл/выкл вывод в формате JSON (все данные из View будут закинуты в 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