====== Page lifecycle ======
Oxwall is under developement at the moment, so below you can see only preliminary version of page-lifecycle. Oxwall implements [[#/|front-controller pattern]] and all requests are handled by single script - index.php (it is the only script available for user requests).
Lets see how it works:
First of all .htaccess file in root directory helps us to redirect all requests to front-controller script.
Code of .htaccess:
Options +FollowSymLinks
RewriteEngine On
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ [NC]
RewriteRule (.*) index.php
Below you can see the code of index.php script:
Code of index.php:
define('_OW_', true);
define('DS', DIRECTORY_SEPARATOR);
define('OW_DIR_ROOT', dirname(__FILE__).DS );
require_once(OW_DIR_ROOT.'includes'.DS.'init.php');
$application = OW_Application::getInstance();
$application->triggerEvent(OW_EventManager::APPLICATION_INIT);
$application->triggerEvent(OW_EventManager::ROUTE_STARTUP);
$application->route();
$application->triggerEvent(OW_EventManager::ROUTE_SHUTDOWN);
$application->dispatch();
$application->finalize();
$application->returnResponse();
As we can see index.php is very simple script representing a number of definite logic steps:
<-- Page start -->
=== Define 3 basic constants ===
* _OW_ - is indicator if core and other classes are included within the OW framework (kind of replacement for 'deny from all' instruction)
* DS - short variant of standart PHP constant DIRECTORY_SEPARATOR
* OW_DIR_ROOT - root directory constant for OW script modules
=== Include init.php script (loads modules for application startup) ===
* load constants and configs to run the appliaction (stored in separate PHP files - define.php and configs.php)
* load global functions (function.php)
* load classes to be used by application in any case
* register autoloader and error manager (exception interceptor, PHP error handler)
=== Create an instance of front-controller class (OW_Application) and initialize it ===
* register non-autoloadable classes in autoloader object (Form, Inputs, etc)
* add static routes from navigation system (static pages added from admin panel) in router object
* register active plugins in plugin manager and load plugin init.php scripts (plugin initializers)
* initialize core basic objects: request, response, event manager, theme manager, etc
* create and add HTML document (OW_HtmlDocument) to response object
=== Trigger event APPLICATION_INIT ===
<-- User request handling start -->
=== Route requested uri (Routing process) ===
* search matching route in static navigation routes
* --- in custom static routes
* --- in dynamic routes
* try to resolve requested uri with system default route
<-- If matches were not found -> show 404 page -->
=== Trigger event ROUTE_SHUTDOWN ===
=== Dispatch routing results (dispatching process) ===
* Check provided dispatch parameters
* Create action controller instance;
* Run controller action;
* Get result markup and put it in HTML document object
=== Trigger event FINALIZE ===
=== Compile and send response ===
* Compile document to send ( controller rendered body + master_page + html head part )
* send added HTTP headers
* send buffered debug output
* send compiled HTML document
<-- Page end (Here script dies) -->