欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Yii框架模拟组件调用注入示例

程序员文章站 2023-01-04 09:15:14
本文实例讲述了yii框架模拟组件调用注入。分享给大家供大家参考,具体如下: 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;
  }
}