Реестр в Yii

27 сентября 2011

Введение

Это вольный перевод вики-статьи Yii registry, how to use it, is it exists at all.

Время от времени люди интересуются использованием реестра в том или ином фреймворке. Если вы использовали ранее, например, Zend Framework, то более чем вероятно, что пользовались кодом:

Zend_Registry::get('paramName');
Zend_Registry::set('paramName');

Реестр в Yii

В Yii тоже существует своя реализация реестра. Изменить существующее или задать новое значение реестра можно так:

Yii::app()->params['paramName']='paramValue';

Получить значение из реестра можно следующим образом:

echo Yii::app()->params['paramName'];

Получение всех значений реестра:

Yii::app()->getParams();
Yii::app()->params;

Можно использовать удобный класс CVarDumper:

CVarDumper::dump(Yii::app()->getParams(), 10, true);

Если вы используете CVarDumper, то вывод будет выглядеть примерно так:

CAttributeCollection#1
(
    [caseSensitive] => true
    [CMap:_d] => array
    (
        'abc' => 123
        'a' => 123
        'c' => 1316855672
        'd' => 'cookie'
    )
    [CMap:_r] => false
    [CComponent:_e] => null
    [CComponent:_m] => null
)

Возможно и массовое присваивание значений посредством массива:

Yii::app()->setParams(array('a'=>123, 'c'=>time(), 'd'=>'cookie'));

Для удаления можно воспользоваться стандартной функцией unset:

unset(Yii::app()->params['abc']);

CMap

Т.к. атрибут params является экземляром класса CMap, то мы имеем в наличии множество методов, которые упрощают нам работу в целом.

Общее количество установленных значений (для примера выше распечатает значение 4):

echo Yii::app()->params->getCount();

Код выше делает тоже самое, что и примеры ниже.

echo Yii::app()->params->count;
echo Yii::app()->params->count();

Можно получить только перечень ключей реестра:

Yii::app()->params->keys;

Вызов выше возвратит массив со следующим содержимым:

'0' => 'abc'
'1' => 'a'
'2' => 'c'
'3' => 'd'

Функция unset уже была упомянута выше, но тем не менее удалять значения можно и так:

Yii::app()->params->remove('abc');

Удаление вообще всех значений в реестре:

Yii::app()->params->clear();

Совет №1

Получение значения атрибута вызовом ->params является тем же самым, что и вызов метода ->getParams(). Присваивание значения атрибуту в виде params['sdf']=$val является тем же самым, что и вызов метода setParams('sdf', $val). Это правило действует и для всего фреймворка в целом: магический метод выполняет всю магию сам. Просто добавьте к классу, который был унаследован от CComponent, метод getSomething и вы сможете использовать одноименный атрибут something, получать и присваивать значения которого можно так:

$object->something=100;
echo $object->something;

Совет №2

Для многих это тривиально и просто, но начальные значения реестра задаются в конфигурационном файле приложения (обычно им является config/main.php):

return array(
    // ...
    'params'=>array('abc'=>123),
    // ...
);

Начальные параметры можно выделить в отдельный конфигурационный файл params.php, а затем можно просто подключить его из основного конфигурационного файла. Для PHP версии 5.3 или выше:

'params'=>require(__DIR__.'/params.php'),

Для PHP версии ниже 5.3:

'params'=>require(dirname(__FILE__).'/params.php'),

Файл config/params.php будет содержать следующий код:

return array(
    'abc' =>123,
);