-
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:
// 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()- Auth -
getCache()- Cache -
getConfig()- Config -
getDb()- Db -
getEventManager()- EventManager -
getMailer()- Mailer -
getMessages()- Messages -
getLayout()- Layout -
getLogger()- Logger - с ленивой инициализацией, если не включено логирование в конфиге, вернёт объект-заглушку Nil -
getRegistry()- Registry -
getRequest()- Request -
getResponse()- Response -
getRouter()- Router -
getSession()- Session -
getTranslator()- Translator -
getView()- создаёт новый экземпляр класса View для замыкания его внутри контроллера
Ещё методы:
-
getPath()- возвращает путь к приложение на файловой системе -
getConfigData($section, $subsection)- возвращает конфигурацию системы, можно указать конкретный узел -
log($message)- системное логирование -
isDebug()- проверяет на debug режим -
hasMessage()- проверяет был ли инициализирован пакет Messages
Методы для работы с выводом:
-
useLayout($flag)- вкл/выкл Layout -
useJson($flag)- вкл/выкл вывод в формате JSON (все данные из View будут закинуты в JSON) -
hasLayout()- проверка использования Layout -
isJson()- проверка режима вывода в JSON
Перезагрузка текущей страницы - применяется для предотвращения сообщения о повторной отправки данных посредством POST. Для AJAX запросов так же срабатывает, для них будет отправлен заголовок Bluz-Reload: true
Синтаксис:
app()->reload(); // anywhere
$this->reload(); // inside controller closureПеренаправление на заданный URL - работает как для обычных, так и для AJAX запросов, для них будет отправлен заголовок Bluz-Redirect: $url
Синтаксис:
app()->redirect($url); // anywhere
$this->redirect($url); // inside controller closureПеренаправление на заданный контроллер.
Синтаксис:
app()->redirectTo($module, $controller, $params); // anywhere
$this->redirectTo($module, $controller, $params); // inside controller closureВозвращает текущего пользователя, если таковой есть.
Синтаксис:
app()->user(); // anywhere
$this->user(); // inside controller closureAcl
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