Новое в LiveStreet Framework: хранилище "ключ => значение" - модуль Storage

Сегодня я расскажу вам о ещё одном хорошем пополнении возможностей для разработчиков — в фреймворке LiveStreet, на котором построена LiveStreet CMS добавлен новый модуль — Storage (написан мной по заказу ООО «ЛС СОФТ»), который является хранилищем типа «ключ => значение». Данное хранилище позволяет легко и быстро работать с небольшими объемами данных, CRUD операции (создание, чтение, обновление и удаление) с которыми теперь занимают всего одну строку кода.

Хранилище является аналогом плагина «Хранилище настроек (Config Engine)», с небольшими отличиями в АПИ, но тем не менее имеет общие элементы и поэтому разработчикам, уже знакомым с указанным плагином будет легче разобраться с хранилищем лс.

Область применения


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

Примечание:

Каждому плагину доступно около 12 Мб места в хранилище в общем случае, это связано с тем, что хранимые данные сериализируются и попадают в столбец с типом mediumtext, который может хранить не более 16 мб текста, но часть забирает служебная информация сериализированного объекта.

Описание АПИ хранилища


Хранилище представляет собой набор методов от низкого уровня к более высокому. Для разработчиков доступны конечные удобные методы. Методы самого низкого уровня работают с операциями CRUD бд и спроектированы таким образом, что у разработчиков для highload проектов есть возможность переопределить эти методы для использования не РСУБД хранилищ, таких как, например, Redis т.е. отказаться от использования MySql.

У хранилища есть две группы методов:

  1. с моментальной записью в бд (рекомендуется к использованию)
  2. с отложенной записью в бд (при установке очень большого количества значений в хранилище)

Методы АПИ с моментальной записью в БД


  1. Записать значение в хранилище
    public function Set($sParamName, $mValue, $oCaller = null, $sInstance = self::DEFAULT_INSTANCE)
    

    Описание параметров:

    $sParamName — имя параметра
    $mValue — записываемое значение (все, кроме объектов типа resource)
    $oCaller — контекст вызываемого модуля. Всегда (и далее по тексту для всех вызовов) в качестве этого значения нужно указывать "$this", который будет указывать на контекст текущего модуля, экшена или блока экосистемы лс. Можно не указывать данный параметр или указывать его как null только для движка и фреймворка. Разработчикам плагинов запрещается опускать данный параметр.
    $sInstance — инстанция. Этот параметр позволяет хранить данные в отдельных «областях» хранилища аналогично как это сделано в классе Config движка.

    Устанавливает значение указанного параметра для плагина.

    Пример использования:
    $this->Storage_Set('my_key', array(1, 2, 3), $this);
    



  2. Получить значение из хранилища
    public function Get($sParamName, $oCaller = null, $sInstance = self::DEFAULT_INSTANCE)
    

    Описание параметров:

    $sParamName — имя параметра
    $oCaller — контекст вызываемого модуля
    $sInstance — инстанция

    Получает значение из параметра для плагина или null.

    Пример использования:
    $this->Storage_Get('my_key', $this);
    



  3. Получить все значения из хранилища
    public function GetAll($oCaller = null, $sInstance = self::DEFAULT_INSTANCE)
    

    Описание параметров:

    $oCaller — контекст вызываемого модуля
    $sInstance — инстанция

    Получает все значения для плагина или пустой массив.

    Пример использования:
    $this->Storage_GetAll($this);
    



  4. Удалить значение из хранилища
    public function Remove($sParamName, $oCaller = null, $sInstance = self::DEFAULT_INSTANCE)
    

    Описание параметров:

    $sParamName — имя параметра
    $oCaller — контекст вызываемого модуля
    $sInstance — инстанция

    Удаляет одно значение указанного параметра для плагина

    Пример использования:
    $this->Storage_Remove('my_key', $this);
    



  5. Удалить все значения из хранилища
    public function RemoveAll($oCaller = null, $sInstance = self::DEFAULT_INSTANCE)
    

    Описание параметров:

    $oCaller — контекст вызываемого модуля
    $sInstance — инстанция

    Удаляет все значения для плагина

    Пример использования:
    $this->Storage_RemoveAll($this);
    


Методы АПИ с отложенной записью в БД


  1. Сохранить значение параметра на время сессии (без записи в хранилище)
    public function SetSmart($sParamName, $mValue, $oCaller = null, $sInstance = self::DEFAULT_INSTANCE)
    

    Описание параметров:

    $sParamName — имя параметра
    $mValue — записываемое значение (все, кроме объектов типа resource)
    $oCaller — контекст вызываемого модуля. Всегда (и далее по тексту для всех вызовов) в качестве этого значения нужно указывать "$this", который будет указывать на контекст текущего модуля, экшена или блока экосистемы лс. Можно не указывать данный параметр или указывать его как null только для движка и фреймворка. Разработчикам плагинов запрещается опускать данный параметр.
    $sInstance — инстанция. Этот параметр позволяет хранить данные в отдельных «областях» хранилища аналогично как это сделано в классе Config движка.

    Устанавливает значение указанного параметра для плагина на момент сессии.

    Пример использования:
    $this->Storage_SetSmart('my_key', array(1, 2, 3), $this);
    



  2. Удалить параметр кеша сессии (без записи в хранилище)
    public function RemoveSmart($sParamName, $oCaller = null, $sInstance = self::DEFAULT_INSTANCE)
    

    Описание параметров:

    $sParamName — имя параметра
    $oCaller — контекст вызываемого модуля
    $sInstance — инстанция

    Удаляет значение из параметра для плагина, без записи в хранилище

    Пример использования:
    $this->Storage_RemoveSmart('my_key', $this);
    



  3. Записать в хранилище значения параметров из кеша сессии
    public function Store($oCaller = null, $sInstance = self::DEFAULT_INSTANCE)
    

    Описание параметров:

    $oCaller — контекст вызываемого модуля
    $sInstance — инстанция

    Записывает данные из сессии хранилище (все что менялось на момент сессии заносится в бд)

    Пример использования:
    $this->Storage_Store($this);
    



  4. Сбросить кеш сессии (без записи в хранилище)
    public function Reset($oCaller = null, $sInstance = self::DEFAULT_INSTANCE)
    

    Описание параметров:

    $oCaller — контекст вызываемого модуля
    $sInstance — инстанция

    Очищает хранилище сессии (и все вносимые в нем правки)

    Пример использования:
    $this->Storage_Reset($this);
    


Пример использования методов для отложенной записи в бд


Раздел методов с отложенной записью удобно использовать если нужно занести несколько значений в бд, не «дергая» постоянно туда-сюда бд:

// добавить одно значение
$this->Storage_SetSmart('my_data_1', array('1, 2, 3), $this);
// добавить ещё одно значение
$this->Storage_SetSmart('my_data_2', array('5, 7), $this);
// удалить первое значение
$this->Storage_RemoveSmart('my_data_1', $this);
// добавить третье значение
$this->Storage_SetSmart('my_data_3', 'text string', $this);
// все эти правки внести в хранилище
$this->Storage_Store($this);
// внести ошибочные данные
$this->Storage_SetSmart('my_data_3', 'incorrect string', $this);
// отказаться от неверных данных (очистить все правки)
$this->Storage_Reset($this);


Благодаря этому модулю писать небольшие плагины станет ещё проще и быстрее.

кросспост из гида по лс.

2 комментария

avatar
Сейчас postgresql далеко не редкость, передислоцировать LS на ее базу и не заниматься извращениями.

Но работа хороша, пусть даже это и только хранилищи, без возможности выборки по нему.
То что нужно для хранения доп. данных и удобного доступа к ним!
avatar
Интересная стстаейка!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.