Приоткрывая завесу над ipsRegistry
В предыдущей записи о новом каркасе IP.Board 3.0, я упоминал о неком компоненте лежащем в основе базы нового каркаса называемом ‘ipsRegistry’. Данная заметка раскроет больше деталей он нем и будет интересна для авторов модификаций.
Обзор
IP.Board, как и любое сложное приложение, использует в работе базовые данные, такие как настройки, сессии и входные данные ($_GET, $_POST и т.п.). Так же необходимы соединение с базой и доступ к глобальным объектам, таким как данные кеша. Согласитесь, что было бы не вероятно расточительно в каждом файле и классе создавать соединение с базой, загружать данные из кеша, проверять сессию и получать какие-либо настройки. А ведь подобные действия в Invison Power Board происходят по нескольку раз.
Понятно что есть необходимость в способе, который бы единожды инициализировал все данные и предоставлял бы доступ к ним из любой части приложения. Именно для этого и предназначен ipsRegistry. В предыдущих версиях IP.Board роль реестра выполнялась объектом ipsclass, но он быстро лишался четких границ при добавлении все большего и большего числа данных к нему. Он был больше глобальной переменной, нежели чем-то еще. Новый регистр составлен из четко определенных объектов. Также в предыдущих версиях инициализация настроек, кешей, входных данных, сессий и прочего было разбросано по разным классам и файлам. В новой версии точка инициализации одна. Эта инициализация происходит когда вызывается метод init(). Тем самым это позволяет достаточно просто использовать регистр IPS в собственных скриптах и модификациях. Тогда как ранее вам необходимо было копировать чуть ли не половину index.php. Сейчас ваши скрипты могут быть много проще:
require_once( 'conf_data.php' );
require_once( 'classes/base/ipsRegistry.php' );
/* Вызываем init, который загружает входные данные, кеши, настройки, создает обработчик для БД, авторизует и загружает пользователя */
$registry = ipsRegistry::instance()->init();
print $registry->request()->getField('foo');
$registry->DB()->do_update( 'table', array( 'foo' => 'bar' ); );
print ( $registry->member()->getProperty('member_id') ) ? 'Привет, ' . $registry->member()->getProperty('members_display_name') : 'Зашли как гость';
Получение входных данных из URL и форм
Ключевой частью инициализации IP.Board была обработка «грязных» данных и создание массива с «очищенными» данными. Это было жизненно важно для общей безопасности форумов. В IP.Board 3.0 для этого выделен объект реестра ‘request’, который содержит все функции необходимые для инициализации и обработки данных (parse_key, parse_value и т.п.) Все они доступны или через $this->request->getField(‘foo’) или через $this->request[‘foo’]. Это является эффективной заменой $this->ipsclass->input[‘foo’];
Кешированные данные
Большое количество улучшений в кеширующем механизме, но их мы опишем в более поздних заметках, потому как речь сейчас идет о реестре. Так вот, кеш объект реестра просто возвращает кеш, когда происходит запрос через $this->registry->cache()->getCache(‘forums’); Сам же кеш загружается и подготавливается для использования во время инициализации, так что вам не надо в ручную делать это.
База данных
Опять же замечу, что большая часть кода работы с базой данных была оптимизирована (рефакторинг), но это заслуживает отдельного рассказа. А пока возвращаясь к реестру скажу, что основной метод для работы с базой — это getDB. Метод возвращает объект DB, который создается во время инициализации через setDB(). Инициализация происходит прозрачно, при подключении файла ( ipsController.php ) и вызове init(). Так же вы можете создать несколько подключений, например:
$this->DB->setDB( 'mysql', 'newConnection', 'user@localhost.com', 'password', 'localhost' );
return $this->registry->DB( 'newConnection' )->build_and_exec_query( array( 'select' => '*', 'from' => 'table' ) );
Настройки
Как и все выше пречисленное кеш настроек загружается и подготавливается к использованию во время инициализации. В реестре объект настроек просто возвращает запрашиваемую настройку (ее значение), вызов происходит так $this->settings->getSetting(‘foo’) или так $this->settings[‘foo’].
Пользовательская информация
В предыдущих версиях сбор пользовательской информации был рассеян по всему ipsclass. Новый регистр IP.Board все это централизует. Этот объект получает IP пользователя, браузер и операционную систему и передает все это member класс. Так же он проверяет сессию (через cookie или из URL), загружает пользовательскую сессию и создает массив пользовательских прав. Все это происходит во время инициализации.
Я надеюсь, что данная заметка даст вам некоторое понимание структуры реестра IPS, а также нововведений, которые он приносит не только в сам Invision Power Board, но и для разработчиков модификаций, которые найдут его достаточно полезным за счет того, что он автоматически создает множество необходимых данных, тем самым экономя их время разработки. Если вы почувствуете, что часть предоставленной информации вам не нужна, то вы сможете унаследовать ipsRegistry и заменить ‘protected’ методы, чтобы убрать их из инициализации.