-
Notifications
You must be signed in to change notification settings - Fork 39
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
Фактически вызывает помощник error
, вынесен в отдельный помощник для возможно переопределения в Applicaiton/Boostrap
классе.
Очищает объект Response
, выставляет код ответа 302 и значение заголовка Location
(либо 204 для AJAX запросов)
Очищает объект Response
, вызывает dispatch()
для контроллера ошибок
Acl
Application
Auth
Cache
Common
— Exception
— Collection
— Container
— Helper
— Options
— Singleton
Config
Controller
— Data
— Mapper
—— Crud
—— Rest
— Reflection
Crud
— Crud Table
Db
— Row
— Table
— Relations
— Query
Debug
EventManager
Grid
Http
Layout
Logger
Mailer
Messages
Nil
Proxy
Registry
Request
Response
Router
Session
Translator
Validator
View