-
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
namespace Application;
// Check CLI
if (PHP_SAPI === 'cli') {
echo "Use `bin/cli.php` instead of `index.php`\n";
exit;
}
// Setup environment
/**
* Debug mode for development environment only,
* use bookmarklets for enable it
* @link https://github.com/bluzphp/skeleton/wiki/Module-System
*/
$debugKey = getenv('BLUZ_DEBUG_KEY') ?: 'BLUZ_DEBUG';
if (isset($_COOKIE[$debugKey])) {
putenv('BLUZ_DEBUG=1');
}
/**
* 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');
// Error Handler
function errorDisplay() {
if (!$e = error_get_last()) {
return;
}
if (!is_array($e)
|| !in_array($e['type'], array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR))) {
return;
}
// clean all buffers
while (ob_get_level()) {
ob_end_clean();
}
// try to write log
errorLog($e['message'], $e['file'] ."#". $e['line']);
// display error page
require_once 'error.php';
}
// Shutdown function for handle critical and other errors
register_shutdown_function('\\Application\\errorDisplay');
// 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';
// Environment
$env = getenv('BLUZ_ENV') ?: 'production';
$app = Bootstrap::getInstance();
$app->init($env);
$app->process();
$app->render();
$app->finish();
} catch (Exception $e) {
// try to write log
errorLog($e->getMessage(), $e->getTraceAsString());
// display error page
require_once 'error.php';
}Создаем симлинку на 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()- по умолчанию инициируется
Http\Request - проверяем запрос на причастность к XmlHttpRequest, при положительном результате отключаем Layout - вызываем
$this->useLayout(false) - проверяем заголовок
acceptна принадлежность кapplication/jsonи при положительном исходе переключаем на вывод в JSON - используя метод$this->useJson(true)
- по умолчанию инициируется
- инициализация объекта Response -
$this->initResponse()- по умолчанию инициируется
Http\Response
- по умолчанию инициируется
- инициализация объекта Router
- запускается маршрутизация, а так же модифицируем
Requestобъект согласно входящему запросу - запускаем
dispatch()конкретного контроллера:- хук
preDispatch()- проверяется доступ согласно
Bluz\Acl
- проверяется доступ согласно
- вызов
doDispatch()- проверяется метод доступа к контроллеру
- проверяем попадание по
@cache-html - проверяем попадание по
@cache - еще раз перетираем параметры Request по текущим параметрам (могут отличаться) и согласно данным из рефлексии
- инициализируем View контроллера
- подключаем bootstrap.php данного модуля, если таковой есть
- подключаем контроллер
- запускаем функцию контроллера
- обрабатываем ответ контроллера (описание можно найти на странице контроллера)
- хук
postDispatch()
- хук
- закидываем ответ контроллера внутрь
Bluz\Responseс использованием методаsetBody()- проверяем результат на принадлежность к
RedirectExceptionи устанавливаем заголовки - проверяем результат на принадлежность к
ReloadExceptionи устанавливаем заголовки - если поймали иное исключение, то система отрабатывает контроллер
error/index(по умолчанию) - если у нас включен Layout, то ответ контроллера закидывается как контент, и уже
Layoutпередаётся вResponse
- проверяем результат на принадлежность к
Вывод для Http\Response запросов происходит по следующему сценарию:
- варианты вывода
- проверка
JSONфлага, добавление заголовков и приведение контента к JSON формату:- данные из
Bluz\Messagesдобавляются в заголовки - данные активного контроллера пакуются в JSON формат
- данные из
- проверка
Вывод для Cli\Response происходит по следующему сценарию:
- вывод данных активного контроллера как набора ключ:значение
За завершения отвечает метод finish(), на данный момент служит лишь для логирования.
Методы для инициализации пакетов фреймворка:
Ещё методы:
-
getEnvironment()- возвращает текущее окружение -
getPath()- возвращает путь к приложение на файловой системе -
isDebug()- проверяет на debug режим
Методы для работы с выводом:
-
hasLayout()- проверка использования Layout -
useLayout($flag)- вкл/выкл Layout -
useJson()- включает вывод в формате JSON (все данные из View будут закинуты в JSON) -
useJsonp()- включает вывод в формате JSONP (все данные из View будут закинуты в JSON, и обёрнуты в вызов функции) -
useXml()- включает вывод в формате XML (все данные из View будут закинуты в XML)
Перезагрузка текущей страницы - применяется для предотвращения сообщения о повторной отправки данных посредством 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