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的常用命令
Oct 09 PHP
用PHP将数据导入到Foxmail的实现代码
Sep 05 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
PHP_Cooikes不同页面无法传递的解决方法
Mar 07 PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
详解PHP+AJAX无刷新分页实现方法
Nov 03 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
PHP上传图片类显示缩略图功能
Jun 30 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
世界第一个无线广播电台 KDKA
2021/03/01 无线电
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
ext 代码生成器
2009/08/07 Javascript
jQuery 使用手册(四)
2009/09/23 Javascript
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
Python单例模式实例分析
2015/01/14 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
通过实例了解python property属性
2019/11/01 Python
wxPython实现绘图小例子
2019/11/19 Python
英国门把手公司:Door Handle Company
2019/05/12 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
高级人员简历的自我评价分享
2013/11/03 职场文书
大学同学聚会邀请函
2014/01/29 职场文书
房产转让协议书
2014/04/11 职场文书
气象学专业个人求职信
2014/04/22 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
宿舍管理制度范本
2015/08/07 职场文书
担保书格式范文
2015/09/22 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python