Skip to content
Anton edited this page Jul 31, 2017 · 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:

// file public/index.php
// Check CLI
if (PHP_SAPI === 'cli') {
    echo "Use `php ./vendor/bin/bluzman` instead of `index.php`\n";
    exit;
}

/**
 * Block iframe embedding for prevent security issues
 * @link https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options
 */
header('X-Frame-Options: SAMEORIGIN');

// Make fake header
header('X-Powered-By: backend');

// Try to run application
try {
    /**
     * @var \Composer\Autoload\ClassLoader $loader
     * @see http://getcomposer.org/apidoc/master/Composer/Autoload/ClassLoader.html
     */
    require_once dirname(__DIR__) . '/vendor/autoload.php';

    // Error handler for log all errors
    set_error_handler('\\Application\\errorHandler', E_ALL);

    // Environment
    $env = getenv('BLUZ_ENV') ?: 'production';
    $app = Bootstrap::getInstance();
    $app->init($env);
    $app->run();
} catch (\Throwable $e) {
    // display error page
    require_once __DIR__ .'/error.php';
    // try to write log "warning"
    errorLog($e);
}

Создаем симлинку на public либо изменяем baseUrl в конфигурационном файле и .htaccess. И запускаем скрипт php bin/install.php (при установке через composer данный скрипт будет запущен автоматически)

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

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

Bluz Dispatch

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

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

Процесс

  • запускается маршрутизация, а так же модифицируем Request объект согласно входящему запросу
  • проверяем запрос на причастность к XmlHttpRequest, при положительном результате отключаем Layout
  • запускаем dispatch() конкретного контроллера:
    • инициируем Controller
    • вызов preDispatch()
      • если прописан @method проверяем метод доступа к контроллеру
      • если прописан @accept (по умолчанию всегда считаем включенным 'text/html') проверяем заголовок accept
      • если прописан @privilege проверяем доступ через Bluz\Acl
    • вызов doDispatch() == Controller::run()
      • если прописан @cache проверяем попадание в кеш
      • инициализируем контейнер данных Controller\Data конкретного контроллера
      • подключаем файл контроллера (это файл с анонимной функцией)
      • запускаем функцию контроллера
      • обрабатываем ответ контроллера (описание можно найти на странице контроллера)
      • возвращаем сущность Controller
    • вызов postDispatch()
  • закидываем ответ контроллера внутрь Bluz\Response с использованием метода setBody()
    • проверяем результат на принадлежность к ForbiddenException - вызываем помощник forbidden()
    • проверяем результат на принадлежность к RedirectException - вызываем помощник redirect()
    • проверяем результат на принадлежность к ReloadException - вызываем помощник reload()
    • если поймали иное исключение, то система вызывает помощник error, который отрабатывает контроллер error/index (по умолчанию)
    • если у нас включен Layout, то ответ контроллера закидывается как контент, и уже Layout передаётся в Response

Вывод

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

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

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

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

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

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

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

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

Ещё методы:

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

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

  • useLayout($flag = null) - проверка использования, а так же вкл/выкл Layout

Application Helpers

forbidden

Фактически вызывает помощник error, вынесен в отдельный помощник для возможно переопределения в Applicaiton/Boostrap классе.

redirect

Очищает объект Response, выставляет код ответа 302 и значение заголовка Location (либо 204 для AJAX запросов)

error

Очищает объект Response, вызывает dispatch() для контроллера ошибок

Clone this wiki locally