среда, 17 февраля 2010 г.

CodeIgniter: Multiple Applications и общие модели в приложениях

CodeIgniter Недавно столкнулся с тем, что в приложениях backend и frontend используются общие модели. Пытался найти в CodeIgniter механизм подключения общих моделей для нескольких приложений. В течении дня были просмотрены несколько русско- и англоязычных сообществ и их форумов, множество блогов и т.д.
Все кто используют frontend и backend на CodeIgniter умалчивают о том, как они работают с моделями.
К вечеру уже начал подниматься вопрос о переходе с CodeIgniter на другой фреймворк, в частности на Zend Framework. После беглого осмотра возможностей Zend Framework'a не нашёл нативной возможности подключения внешних моделей. :(

Сегодня решил по глубже посмотреть ядро CodeIgniter, на предмет добавления хака для работы с общими моделями.
Решение вопроса былой найдено в классе ядра CI_Loader.
Собственно вопрос решался изменением двух строк 162 и 180 в которых используются пути к моделям.
Строка 162:
if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))
Cтрока 180:
require_once(APPPATH.'models/'.$path.$model.EXT)
Первой мыслью было просто заменить пути и не париться, но тогда лишился бы возможности использовать локальные модели для каждого приложения.
Просмотрев документацию по созданию классов ядра, нашёл более простое и нативное решение. Расширение класса ядра CI_Loader.
class MY_Loader extends CI_Loader {

function My_Loader()
{
parent::CI_Loader();
}

function global_model($model, $name = '', $db_conn = FALSE)
{
....
}

}

global_model полностью копирует model за исключением двух строк в которых изменяем пути.
Остаётся положить MY_Loader в libraries обоих приложений и теперь имеем возможность использовать глобальные и локальные модели.

На мой взгляд такой вариант наиболее оптимальным, т.к. это не вност изменения в ядро системы, легко переноситься в другие приложения, не требует лишних телодвижений при обновлении CodeIgniter'а.

Естественно нельзя использовать локальные и глобальные модели с одинаковыми именами. В контроллерах, за исключеним замены $this->load->model('Model_name'), на $this->load->global_model('Model_name') для глобальных моделей, ничего менять не придётся, т.к. мы только расширим Loader.

На практике пока не опробовано, но займусь этим в ближайшее время.

Похожие по тематике посты:

Комментариев нет: