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开发负载均衡指南
Jul 17 PHP
PHP 查找字符串常用函数介绍
Jun 07 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
php获取url参数方法总结
Nov 13 PHP
php二维数组合并及去重复的方法
Mar 04 PHP
php专用数组排序类ArraySortUtil用法实例
Apr 03 PHP
CodeIgniter连贯操作的底层原理分析
May 17 PHP
PHP XML和数组互相转换详解
Oct 26 PHP
Laravel网站打开速度优化的方法汇总
Jul 16 PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 PHP
PHP序列化和反序列化深度剖析实例讲解
Dec 29 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 文章调用类代码
2011/08/11 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
让复选框只能选择一项的方法
2013/10/08 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
详解JavaScript对象和数组
2015/12/03 Javascript
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
Python中字符串与编码示例代码
2019/05/20 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
2015年人事科工作总结
2015/04/28 职场文书
教师继续教育反思周记
2015/06/25 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技