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


Posted in PHP onNovember 11, 2019

本文实例讲述了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;
  }
}

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
一棵php的类树(支持无限分类)
Oct 09 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
php 判断字符串中是否包含html标签
Feb 17 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
Oct 14 PHP
浅析php创建者模式
Nov 25 PHP
php排序算法实例分析
Oct 17 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
php无限级分类实现评论及回复功能
Feb 18 PHP
TP5框架实现签到功能的方法分析
Apr 05 PHP
在Laravel中使用MongoDB的方法示例
Nov 11 #PHP
PHP使用递归按层级查找数据的方法
Nov 10 #PHP
php和js实现根据子网掩码和ip计算子网功能示例
Nov 09 #PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 #PHP
php进程(线程)通信基础之System V共享内存简单实例分析
Nov 09 #PHP
PHP多进程简单实例小结
Nov 09 #PHP
PHPUnit + Laravel单元测试常用技能
Nov 06 #PHP
You might like
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
js读取本地excel文档数据的代码
2010/11/11 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
详解Vue爬坑之vuex初识
2017/06/14 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
python实现文件的分割与合并
2019/08/29 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
python关于变量名的基础知识点
2020/03/03 Python
python能在浏览器能运行吗
2020/06/17 Python
python使用selenium爬虫知乎的方法示例
2020/10/28 Python
公司财务工作总结的自我评价
2013/11/23 职场文书
爱情检讨书大全
2014/01/21 职场文书
环保建议书200字
2014/05/14 职场文书
奉献家乡演讲稿
2014/09/16 职场文书
小班教师个人总结
2015/02/05 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
2019各种保证书范文
2019/06/24 职场文书
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
速龙x4-860k处理器相当于i几
2022/04/20 数码科技