1

这对我来说很难解释,但我会尽力而为。

我开始编写一个 CApplicationComponent 从数据库获取配置参数。

<?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,但我真的不知道怎么做。

有更好的方法吗?谁能指出我正确的方向?

非常感谢

4

1 回答 1

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
于 2013-07-28T03:46:35.623 回答