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 相关文章推荐
基于mysql的论坛(3)
Oct 09 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
Oct 08 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
Apr 15 PHP
PHP mkdir()无写权限的问题解决方法
Jun 19 PHP
本地计算机无法启动Apache故障处理
Aug 08 PHP
PHP实现的简单日历类
Nov 29 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
Aug 18 PHP
微信支付扫码支付php版
Jul 22 PHP
PHPMailer发送邮件
Dec 28 PHP
Laravel实现表单提交
May 07 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 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
基于mysql的论坛(6)
2006/10/09 PHP
php入门小知识
2008/03/24 PHP
PHP-MySQL教程归纳总结
2008/06/07 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
vue组件间通信解析
2017/03/01 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
Python实现Linux的find命令实例分享
2017/06/04 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
python对csv文件追加写入列的方法
2019/08/01 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
Python编写单元测试代码实例
2020/09/10 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
教师个人发展总结
2015/02/11 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL