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;
  }
}

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

(0)

相关推荐

  • 详解PHP的Yii框架中组件行为的属性注入和方法注入

    行为的属性和方法注入原理 上面我们了解到了行为的用意在于将自身的属性和方法注入给所依附的类. 那么Yii中是如何将一个行为 yii\base\Behavior 的属性和方法, 注入到一个 yii\base\Component 中的呢? 对于属性而言,是通过 __get() 和 __set() 魔术方法来实现的. 对于方法,是通过 __call() 方法. 属性的注入 以读取为例,如果访问 $Component->property1 ,Yii在幕后干了些什么呢? 这个看看 yii\base\Com

  • Yii框架响应组件用法实例分析

    本文实例讲述了Yii框架响应组件用法.分享给大家供大家参考,具体如下: 当我们的浏览器发送过来一个请求之后,在我们的操作里面对请求经过处理之后,我们的服务器也会把请求的结果打包成一个消息,然后把这个消息返还给浏览器,这个消息我们称之为响应.在我们的操作中,我们也可以对响应进行一些设置和处理.要处理我们的响应,我们需要先获得响应组件这个东西. $response = \Yii::$app->response; 有了这个响应组件之后,我们可以对响应消息进行一些设置了,比如设置响应的状态码. $res

  • Yii核心组件AssetManager原理分析

    本文我们通过yii自带的demo-blog程序来分析Yii核心组件AssetManager,他可以自动加载css和javascript,并且只需要一句代码即可.具体分析如下: 打开blog的首页,会看到如下的引入js的html代码: 复制代码 代码如下: <link rel="stylesheet" type="text/css" href="/yii/demos/blog/assets/d6bb6ebe/highlight.css" /&

  • Yii扩展组件编写方法实例分析

    本文实例讲述了Yii扩展组件编写方法.分享给大家供大家参考.具体如下: 因为Yii本身就引入了Prado的component-based 思想做为主要思想.因此,组件在yii中是很重要的. 组件一般放在components目录里,其格式示例基本如下: <?php /** * some description about the <span style="color: rgb(34, 34, 34); font-family: Arial, sans-serif; font-size:

  • Yii框架组件和事件行为管理详解

    本文实例讲述了Yii框架组件和事件行为管理.分享给大家供大家参考,具体如下: Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.CComponent几乎是所有类的基类,它控制着组件与事件的管理,其方法与属性如下,私有变量$_e数据存放事件(evnet,有些地方叫hook),$_m数组存放行为(behavior). 组件管理 YII是一个纯oop框架,很多类中的成员变量的受保护或者私有的,CComponent中利用php中的魔术方法__get(),__set()来访问和设置属

  • YII使用url组件美化管理的方法

    本文实例讲述了YII使用url组件美化管理的方法.分享给大家供大家参考,具体如下: urlManager组件 yii的官方文档对此的解释如下: urlSuffix  此规则使用的url后缀,默认使用CurlManger::urlSuffix,值为null.例如可以将此设置为.html,让url看起来"像"是一个静态页面. caseSensitive  是否大小写敏感,默认使用CUrlManager::caseSensitive,值为null. defaultParams  该规则使用的

  • 简要剖析PHP的Yii框架的组件化机制的基本知识

    组件是 Yii 应用的主要基石.是 yii\base\Component 类或其子类的实例.三个用以区分它和其它类的主要功能有: 属性(Property) 事件(Event) 行为(Behavior) 或单独使用,或彼此配合,这些功能的应用让 Yii 的类变得更加灵活和易用.以小部件 yii\jui\DatePicker 来举例,这是个方便你在 视图中生成一个交互式日期选择器的 UI 组件: use yii\jui\DatePicker; echo DatePicker::widget([ 'l

  • Yii框架通过请求组件处理get,post请求的方法分析

    本文实例讲述了Yii框架通过请求组件处理get,post请求的方法.分享给大家供大家参考,具体如下: 在控制器的操作中处理get,post请求时,首先需要获得请求组件. $request = \Yii::$app->request; 得到这个请求组件后,我们就可以通过请求组件获得参数了. //通过get获取参数 $id = $request->get("id"); //通过post获取参数 $id = $request->post("id"); 在

  • yii2行为的方法如何注入到组件类中详解

    前言 当了解了行为属性的注入逻辑后,方法的注入对于我们来说就很简单了.逻辑一样.只不过此刻我们不再调用 __get 方法,而是一个用于方法的 __call 方法.下面话不多说了,来一起看看详细的介绍: 在研究之前先跟我学习两个PHP的知识: __call call_user_func_array __call __call 是 PHP 的一个魔术方法,这个方法和 __get 功能差不多,当发现一个类的方法未定义时会触发此函数,它有两个参数 public mixed __call ( string

  • Yii2中组件的注册与创建方法

    今天本来打算研究一下yii2.0的AR模型的实现原理,然而,计划赶不上变化,突然就想先研究一下yii2.0的数据库组件创建的过程.通过对yii源码的学习,了解了yii组件注册与创建的过程,并发现原来yii组件注册之后并不是马上就去创建的,而是待到实际需要使用某个组件的时候再去创建对应的组件实例的.本文大概记录一下这个探索的过程. 要了解yii组件的注册与创建,当然要从yii入口文件index.php说起了,整个文件代码如下: <?php defined('YII_DEBUG') or defin

  • Yii框架核心组件类实例详解

    本文实例讲述了Yii框架核心组件类.分享给大家供大家参考,具体如下: CComponent类为YII框架的基于组件和事件驱动编程提供了基础,YII框架中的大部分类都将CComponent类作为基类. CComponent类为它的子类提供3个特性: 1.成员变量扩展 通过定义两个成员函数(getXXX/setXXX)来定义一个成员变量,比如: public function getText() {-} public function setText {-} 这样就相当于定义了一个$text成员变量

随机推荐