2015-11-23 3 views
1

Я хочу делать то, что именно Yii2 делать с компонентом в config файле в YII config:Yii 2 инициализации компонента

'someComponent'=> 
[ 
    'class' => '\namespace\to\class', 
    'param1' => 'somevalue', 
    'param2' => 'somevalue', 
] 

Как я могу сделать это Yii делать в собственном классе, дать ему массив компонента файл, а затем мой класс создает и экземпляр и инициализирует его?

EDIT:

Файл конфигурации:

'payment' => [ 
      'class' => 'backend\modules\payment\Bank', 
      'components' => [ 
       'service' => [ 
        'class' => 'backend\modules\payment\components\Service', 
        'adaptors'=>[ 
         'BankMeli' => [ 
          'class'=>'backend\modules\payment\adaptors\BankMeli', 
          'test'=>'1', 
         ] 
        ] 
       ], 
      ], 
     ], 

Service Component:

namespace backend\modules\payment\components; 

use Yii; 
use yii\base\Component; 

class Service extends Component 
{ 
    public $adaptors = []; 
    public function init() 
    { 
     parent::init(); 
     $adaptors = new \stdClass(); 
     foreach($this->adaptors as $key=>$adaptor) 
     { 
      $class = $adaptor['class']; 
      unset($adaptor['class']); 
      $adaptors->$key = Yii::createObject($class,$adaptor); 
     } 
     $this->adaptors = $adaptors; 
    } 

    public function run() 
    { 

    } 
} 

Внутренний компонент (BankMeli), что необходимо инициализируются:

namespace backend\modules\payment\adaptors; 


use Yii; 
use yii\base\Component; 

class BankMeli extends Component 
{ 
    public $test; 

    public function __construct($config = []) 
    { 
     parent::__construct($config); 
    } 
    public function init(){ 
     parent::init(); 
    } 
} 

var_dump (сервис-> адаптер с) Выход:

object(stdClass)[61] 
    public 'BankMeli' => 
    object(backend\modules\payment\adaptors\BankMeli)[72] 
     public 'test' => null 
     private '_events' (yii\base\Component) => 
     array (size=0) 
      empty 
     private '_behaviors' (yii\base\Component) => null 

РЕШИТЬ:

Я передал парам массив внутри другого массива и решаемой задачи:

$adaptors->$key = Yii::createObject($class,[$adaptor]); 
+0

что вам нужно сделать точно? Я не понял. –

+0

Мне нужно мое свойство компонента (службы) (оно имеет некоторую опечатку, просто проигнорируйте его), просто инициализировалось как обычный компонент с конфигурационным массивом – mmta41

ответ

0

С Yii::createObject() yii2 созданный объект компонента с конфигурации в файле конфигурации. Это как это:

Все в yii2 расширяет Object класс, в конструкторе можно ввести конфигурации Params. param1 и param2 должны быть общедоступными, или модель должна иметь геттер и сеттеры.

public function __construct($config = []) 
{ 
    if (!empty($config)) { 
     Yii::configure($this, $config); 
    } 
    $this->init(); 
} 
+1

Спасибо за ответ, объект создан, но свойства не инициализированы, – mmta41

+0

Вам следует использовать родительский :: __ construct ($ config) в конце вашего конструктора компонентов и расширяет 'Object' или' Component'. –

+1

это код в классе: 'public function __construct ($ config = []) { var_dump ($ config); parent :: __ construct ($ config); if (! Empty ($ config)) { Yii :: configure ($ this, $ config); } $ this-> init(); } ' , но $ config пуст – mmta41

Смежные вопросы