这对我来说很难解释,但我会尽我所能。
我开始编写一个CApplicationComponent来从DB获取配置参数。
<?php
class parameters extends CApplicationComponent
{
public $cacheAll = false;
public $dbConnectionId = null;
public $applications = array();
public function __get( $attr )
{
if( $this->applications && in_array($attr, $this->applications) )
{
if( Yii::app()->$$this->applications[$attr]['id'] )
{
//in work...
}
}
}
}
public $applications
将是这样的数组:
$arrray = array (
'productName' => array (
'tableName'=>'settings',
'propertyColumn'=>'parameters',
'valueColumn'=>'values',
),
);
嗯......事实是我需要或者最想要的是获得这样的属性:
Yii::app()->parameters->productName->param1
我知道Yii为类属性实现了魔法getter和setter,所以我会这样访问$applications
:
Yii::app()->parameters->applications
所以,我现在重写__get
函数,看看请求的值是否是数组$ applications中的一个键,否则我会将它委托给Yii定义的parent::__get($attr)
。
如果请求的值是$ applications数组中的一个键,那么我将不得不创建一个对象,这样我就可以使用->
运算符和另一个魔术setter / getter,但我真的不知道怎么样。
有更好的方法吗?有人能指出我正确的方向吗?
非常感谢
答案 0 :(得分:1)
假设你的配置文件中有这个:
...
'components' => array(
'parameters' => array(
'class' => 'path.to.parameters.php',
'applications' => array(
'productName' => array(
'tableName' => 'settings',
'property' => 'param1'
),
)
),
),
...
如果您希望\Yii::app()->parameters->productName->tableName
返回值"settings"
。然后,您的应用程序组件必须覆盖__get
魔术方法,以使用$this->applications
检查"productName"
是否包含isset()
密钥,并将该键的值作为对象而不是数组返回
应用程序组件如下所示:
<?php
namespace Sakanade;
class parameters extends \CApplicationComponent
{
public $cacheAll = false;
public $dbConnectionId = null;
public $applications = array();
public function __get($attr)
{
// If `$attr` is a key in `$this->applications`, return that
if (is_array($this->applications) && isset($this->applications[$attr])) {
// Convert to an object
return (object) $this->applications[$attr];
}
// Return the default implementation by CApplicationComponent
return parent::__get($attr);
}
}
我把它放在一个控制器中测试了这个:
$tableName = \Yii::app()->parameters->productName->tableName;
print_r($tableName); // prints "settings"
组件中已存在的其他属性可以正常访问:
var_dump(\Yii::app()->parameters->cacheAll); // false
var_dump(\Yii::app()->parameters->dbConnectionId); // null