In-Portal Developers Guide

This is a wiki-based Developers Guide for In-Portal Open Source CMS. The purpose of this guide is to provide advanced users, web developers and programmers with documentation on how to expand, customize and improve the functionality and the code the In-Portal software. Please consider contributing to our documentation writing effort.

K4:Application Process Flow

From In-Portal Developers Guide

Jump to: navigation, search

Alex (Talk | contribs)
(дополнение)
Next diff →

Revision as of 17:41, 4 November 2009


Структура приложения Структура приложения
Статьи в этой категории

Contents

kApplication - центральный класс системы

Объект этого класса создаётся одним из первых и содержит среди своих свойств ссылки на другие важные классы - Session, TemplateParser, kFactory, kHTTPQuery, kEventManager. Также, практически все прочие объекты имеют среди своих свойств ссылку на центральный объект приложения. Таким образом обеспечивается взаимодействие различных компонентов в системе.


$event = new kEvent('custom-sections:OnAddListingLog');
$event->setEventParam('mode', LISTING_MODE_EXTERNAL);
$this->Application->HandleEvent($event);

Пример иллюстрирует - благодаря тому, что центральный объект хранит ссылки на важнейшие объекты, практически из любого места систьемы можно вызвать любое событие.

В методе kApplication::HandleEvent обработка события делегируется объекту, ссылка на который находится в свойстве $this->Application->EventManager. По умолчанию это - объект класса kEventManager.

В свою очередь, для обработки события из метода kEventManager::HandleEvent опять же следуют обращения к методам центрального класса. Например, чтобы получить объект обработчика для конкретного указанного события, используется такая конструкция:

$event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler');
/* @var $event_handler kEventHandler */
$event_handler->processEvent($event);

То есть, вызывается метод kApplication::recallObject, получающий ссылку на необходимый обработчик событий путём обращения к другому базовому объекту, ссылка на который доступна в свойстве Factory.

$result =& $this->Factory->getObject($name, $pseudo_class, $event_params);

Если объект обработчика события ещё не создан, то объект класса kFactory его создаёт, и дополнительно, опять же - обращаясь к центральному объекту Application, получает и обрабатывает событие (так называемое Build Event), которое должно происходить при создании обработчика исходного события:

$event =& $this->Application->EventManager->getBuildEvent($pseudo_class);
if($event)
{
	$event->Init($prefix,$special);
	foreach($event_params as $param_name=>$param_value)
	{
		$event->setEventParam($param_name,$param_value);
	}
	$this->Application->HandleEvent($event);
}


Основные фазы работы приложения

Это инициализация, основная фаза и фаза завершения. Пример - из стандартного кода скрипта index.php:

$application =& kApplication::Instance(); - получение ссылки на объект
$application->Init(); - инициализация
$application->Run(); - основная фаза
$application->Done(); - фаза завершения

Фаза инициализации

Для того, чтобы использовать всю мощь, все возможности K4, надо вначале обеспечить инфраструктуру - создать все основные объекты, установить между ними связи, инициализировать эти объекты - то есть, произвести в них операции в соответствии с поступившими данными HTTP-запроса, текущими настройками WEB-сервера, значениями в базе данных и.т.п.

Подключение к базе данных и создание объекта для операций с базой данных

В kApplication::Init() для этого есть такой код:

$this->Conn = new kDBConnection(SQL_TYPE, Array(&$this, 'handleSQLError') );  // создание объекта
$this->Conn->debugMode = $this->isDebugMode();
$this->Conn->Connect(SQL_SERVER, SQL_USER, SQL_PASS, SQL_DB); // подключение к базе данных проекта

Подключение к базе данных осуществляется через объект класса kDBConnection. Ссылка на объект помещается в свойство Conn основного объекта приложения, в свою очередь, объект класса kDBConnection в своём конструктроре получает ссылку на основной объект приложения и сохраняет его в своём свойстве Application:

$this->Application =& kApplication::Instance();

В классах, интенсивно использующих доступ к базе данных (например, в kDBBase и его наследниках kDBItem и kDBList), в целях повышения скорости, ссылка на объект для операций с базой данных хранится в отдельном свойстве Conn:

function kDBBase()
{
	parent::kBase();
	$this->Conn =& $this->Application->GetADODBConnection();
}

Таким образом, после инициализации, практически из любого метода имеется лёгкий доступ к базе данных:

$all_tables = $this->Conn->Query('SHOW TABLES');


Создание объекта Factory и регистрация основных классов в нём

В kApplication::Init() для этого есть такой код:

$this->Factory = new kFactory();

Объект Factory - один из основных объектов приложения. Его предназначение - учитывать какие объекты уже создавались, и, если запрашиваемый объект уже создавался - просто возвращать ссылку на него. Естественно, чтобы учитывать создание других объектов, объект класса kFactory создаётся раньше.

В K4 широко применяется принцип отложенной инициализации. Объекты как правило создаются только тогда, когда они становятся реально необходимы. Благодаря функциональности kFactory для соблюдения принципа отложенной инициализации требуется только одно - зарегистрировать классы, из которых могут впоследствии создаваться объекты. Регистрация класса это быстрая, требующая мало ресурсов операция, которая подразумевает запись в свойства-массивы объекта Factory таких данных как:

  • псевдоним класса
  • расположение файла с кодом класса
  • классы, которые должны быть определены прежде чем данный класс

Сразу же после создания объекта Factory регистрируются базовые классы - такие, которые необходимы для продолжения инициализации приложения, либо на более поздних фазах работы приложения.

$this->RegisterDefaultClasses();

Название функции переводится с английского как "регистрировать классы по умолчанию". Это так называется потому, что любой зарегистрированный в Factory класс может оказаться подменённым на более поздних этапах инициализации в соответствии с конфигурацией конкретного приложения.