Друзья
Реестр в 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, );