Yii - 模拟组件调用注入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014559227/article/details/77877397

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

}

猜你喜欢

转载自blog.csdn.net/u014559227/article/details/77877397
yii