1. 程式人生 > >Yii - 模擬元件呼叫注入

Yii - 模擬元件呼叫注入

yii 中元件只有在被呼叫的時候才會被例項化,且在當前請求中之後呼叫該元件只會使用上一次例項化的例項,不會重新生成該例項。

'components'    =>  array(
    '元件呼叫名'   =>   '元件呼叫名稱空間',
    '元件呼叫名'   =>  array(
            'class'  =>  '元件呼叫名稱空間'
    );
    '元件呼叫名'   => function(){
        return new '元件呼叫名稱空間';
    }
)

一個類似的小元件,可以實現上述功能。方便我們儲存服務功能元件。

<?php

namespace app\components\Services;

/**
 * 自定義服務層呼叫元件
 * 支援 的例項模式只有yii模式的string 和 array 模式
 * 例子
 * services => array(
 *      'customService' =>  array(
*               'class' =>  'app\components\Custom\Custom',
*               'name'  =>  '我是勇哥'
*           ),
 * )
 */
class
Services {
private $dataObj = array(); private $classes = array(); public function __set($name,$value) { $this->classes[$name] = $value; } public function __get($name) { if(!isset($this->dataObj[$name]) || $this->dataObj[$name] == null) { $classInfo
= $this->classes[$name]; $this->dataObj[$name] = is_array($classInfo) ? (new $classInfo['class']) : (new $classInfo); if(is_array($classInfo)) foreach($classInfo as $a=>$b) if($a != 'class') $this->dataObj[$name]->$a = $b; } return $this->dataObj[$name]; } }

web.php

'components'=>array(
    'services'  =>  array(
        'class'   =>   'app\components\Services\Services',

        //自定義服務 custom1
        'custom1Service' => array(
            'class'  =>  'app\services\Custom1\Custom1',
            //需要注入的屬性值
            'name'   => '我是勇哥',
            'age'    => 22
        ),

        //自定義服務 custom2
        'custom2Service' => array(
            'class'  =>  'app\services\Custom2\Custom2',
            //需要注入的屬性值
            'name'   => '我是勇哥',
            'age'    => 22
        ),
    )
)

控制層呼叫

<?php

namespace app\controllers\home;

use Yii;
use yii\web\Controller;

class IndexController extends Controller
{


    public function actionIndex()
    {
        echo Yii::$app->services->custom1Service->name;
    }

}