2013-07-26 2 views
1

이것은 설명하기 어렵지만 최선을 다할 것입니다.Yii 구성 요소의 오브젝트 반환

DB에서 구성 매개 변수를 가져 오기 위해 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를 구현하므로 다음과 같이에 액세스합니다.

Yii::app()->parameters->applications 

그래서, 지금 요청 된 값이 배열 $ 응용 프로그램의 핵심이 있는지 확인하려면 __get 기능을 무시하고, 그렇지 않으면 나는 YII의 정의 하나 parent::__get($attr)과에 위임합니다.

요청한 값이 $ applications 배열의 키인 경우 -> 연산자와 다른 마법 설정기/getter를 사용할 수 있도록 객체를 만들어야하지만 실제로는 아직 모릅니다.

거기에 더 좋은 방법이 있습니까? 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

덕분에 많은

+0

정확히 어떤 문제가 있습니까? 객체를 만들 때? – Shiki

+0

문제는 어떻게 $ application 배열의 세부 사항을 주어진 구성 요소에있는 문법을 가질 수 있습니까 – JorgeeFG

답변

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 마법 메서드를 재정 의하여 을 사용하여 "productName" 키가 포함되어 있는지 확인하고 해당 키 값을 배열 대신 개체로 반환해야합니다.

응용 프로그램 구성 요소는 다음과 같이 보일 것이다 : 이미 일반적으로 액세스 할 수있는 구성 요소에 존재

$tableName = \Yii::app()->parameters->productName->tableName; 
print_r($tableName); // prints "settings" 

다른 속성 :

<?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); 
    } 
} 

내가 컨트롤러에이를 넣어이 테스트

var_dump(\Yii::app()->parameters->cacheAll);  // false 
var_dump(\Yii::app()->parameters->dbConnectionId); // null 
+0

고마워요,하지만 제 아이디어는 마법의 세터와 getters를 두 번째 레벨에서 사용하는 것입니다 .... supose,'Yii :: app.-> parameters-> productName-> product_param1' (this가 설정 됨),'Yii :: app() -> parameters-> productName-> product_param1 = '뭔가'(설정 됨). 'productName'은 컴포넌트의 msetter/getter에 의해 반환 될 것이므로, 나는 그 인스턴스에서 모델을 생성하고 그것을 반환해야하고 생성 된 모델에서 마술 세터와 getter를 구현하여 실제로 DB에서 파라미터를 가져 오거나 설정해야한다고 생각합니다. 어떻게 생각하니? – JorgeeFG

+0

@Jorge 알았어. 그게 니가 의미 한거야. 그래, 좋은 생각이야. 아마도'__get'과'__set'을 구현하는 또 다른 클래스를 만들어야 할 것입니다.데이터가 _readonly_ 인 경우 배열을 객체로 변환하지 않아도됩니다. 이 대답을 예제로 업데이트했습니다. – Shiki