Application
Описание
Наше приложение, далеко не God Object ;)
Настройка
Начинаем все с document root'a, вот вам пример .htaccess (в skeleton он уже есть), с его помощью все запросы будут заворачиваться на 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:

Инициализация
- вытягивает конфигурацию текущего окружения с использованием пакета 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() для контроллера ошибок