YII2依赖注入和事件的使用

YII2的核心就是依赖注入和事件处理,同Spring的IOC和AOP功能基本是一样的,YII的依赖注入可以使得我们使用对象的时候,YII的容器帮助我们创建大大提高了效率,并且,一部分又提高的内存的使用率,如果我们自己控制对象,可能过程中会浪费不必要的内容空间,YII的事件,就好比AOP,AOP我做java开发的时候最多是对日志的控制,和事物的控制,还有权限。YII的事件同样可以实现这些。

eg:

 IOC又称DI(依赖注入)

首先:我在frontend文件夹下面创建了service文件夹来存放创建的自定义接口和接口的实现类。

IUserService.php

<?php
namespace frontend\service;
	/**
	 * 用户业务逻辑接口
	 */
    interface IUserService{

    	public function getAllUsers();

    	public function getUserById($id);

    } 

IUserServiceimpl.php 接口实现类

<?php
namespace frontend\service;
use frontend\models\User;
use yii\base\Object;
	/**
	 *用户业务逻辑实现
	 *实现用户业务逻辑接口
	 *
	 */
   class IUserServiceimpl extends Object implements IUserService{

		 public function __construct()
		    {

		        parent::__construct();
		    }

   		public function getAllUsers(){

   			//$list = User::find()->asArray()->all();
   			//$user = new User();
   			$list = User::getInstance()->getAllUsers();

   			return $list ? $list : [];

   		}
   		public function getUserById($id){

   				return User::findOne($id);

   		}

   }

Model层User.php

<?php 

namespace frontend\models;

use yii\base\Model;
use yii\db\ActiveRecord;
use Yii;
use frontend\models\Order;
use yii\web\IdentifyInterface;

    class User extends ActiveRecord
     {

        // 第一步:定义自己的事件
        const EVENT_BEFORE_MARK_QUERY = 'beforeMarkDelete';
        const EVENT_AFTER_MARK_QUERY = 'afterMarkDelete';

         // 第一步:在初始化阶段绑定事件和Event Handler
        public function init()
        {
            parent::init();
            $this->trigger(self::EVENT_INIT);
            // 完成绑定
            $this->on(self::EVENT_BEFORE_MARK_QUERY, [$this, 'onBeforeMarkQuery']);
            $this->on(self::EVENT_AFTER_MARK_QUERY,[$this,'onAfterMarkQuery']);

        }
        // 第二步:定义Event Handler
        public function onBeforeMarkQuery () {

             echo "我在查询之前进行了拦截"."<br>";
             //exit;
        }
        // 第二步:定义Event Handler
        public function onAfterMarkQuery () {

            echo "查询完了,想返回数据,别想,数据就在上面,去拿吧";
            exit;
        }
         /**
         * 获取所有用户信息
         */
        public  function getAllUsers(){
            // 触发事件
            $this->trigger(self::EVENT_BEFORE_MARK_QUERY);
            $list = static::find()->asArray()->all();
            echo "<pre>";
            print_r($list);
            $this->trigger(self::EVENT_AFTER_MARK_QUERY);

        }
        /**
         * 实例化User对象
         * @return User
         */
        public static function getInstance(){

                return new self;
        }
        /**
         * 返回表名
         */
        public static function tabName(){

             return 'user';
        }
        /**
         * 返回当前的数据库连接信息
         */
        public static function getDBInfo(){

            return parent::getDb();

        }    

    }

接下来对接口的实现进行配置:

在入口文件index.php里面配置

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php');
require(__DIR__ . '/../config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../../common/config/main.php'),
    require(__DIR__ . '/../../common/config/main-local.php'),
    require(__DIR__ . '/../config/main.php'),
    require(__DIR__ . '/../config/main-local.php')
);
// 注册一个接口
Yii::$container->set('frontend\\service\\IUserService', 'frontend\\service\\IUserServiceimpl');
// 注册一个别名
Yii::$container->set('userservice','frontend\\service\\IUserService');
//定义路径别名
Yii::setAlias('@getuser' , 'index.php?r=face/getusers ');
//加载配置文件
$application = new yii\web\Application($config);
$application->run();

创建一个控制器,来测试:

<?php 

namespace frontend\controllers;
use Yii;
use frontend\service\IUserService;
use yii\web\Controller;
use yii\di\Container;
use yii\helpers\ArrayHelper;
use frontend\models\UserForm;

	 class FaceController extends Controller{

	 		private  $userService;

	 		public function __construct($id, $module,$config = []){

	 				//DI容器获取实例化的对象
	 				//$this->userService = \Yii::$container->get('userservice');
	 				//Service Locator通过 Yii::createObject() 来获取实例, 而这个 Yii::createObject()
	 				//是调用了DI容器的 yii\di\Container::get() 来向 Yii::$container 索要实例的。
	 				// 因此,Service Locator最终是通过DI容器来创建、获取实例的。
	 				$this->userService = \Yii::createObject('userservice');
	 				parent::__construct($id, $module,$config);

	 		}

			/**
		     * @inheritdoc
		     */
		    public function actions()
		    {
		        return [
		            'error' => [
		                'class' => 'yii\web\ErrorAction',
		            ],
		            'captcha' => [
		                'class' => 'yii\captcha\CaptchaAction',
		                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
		            ],
		        ];
		    }
		    /**
		     * 获取所有用户
		     *
		     */
	 	     public function actionGetusers(){

	 				$list = $this->userService->getAllUsers();
	 				echo "<pre>";
	 				print_r($list);
	 				exit;

	 		}
	 		public function actionGetuserbyid(){

	 			$user = $this->userService->getUserById('2');
	 			$user = ArrayHelper::toArray($user);
	 			echo "<pre>";
	 			print_r($user);
	 			exit;

	 		} 		

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 04:02:24

YII2依赖注入和事件的使用的相关文章

yii2 随笔(七)依赖注入——(3)yii2的依赖注入

原文地址:p=124" target="_blank">http://ivhong.com/? p=124(ivhong.com 是我的博客主址) yii2的依赖注入的核心代码在 yii\di.在这个包(目录)以下有3个文件.各自是Container.php(容器),Instance.php(实例),ServiceLocator(服务定位器),如今我们讨论一下前两个.服务定位器能够理解一个服务的注冊表.这个不影响我们讨论依赖注入,它也是依赖注入的一种应用. 我们还是从代

Yii2 学习笔记 01 -- 依赖注入在yii2中的应用

什么是依赖注入?                  依赖注入(Dependency Injection)是设计模式的一种.名字比较抽象,但是,要解决的问题却是比较明确.对于给定的应用程序,需要借助一些相对独立的组件来完成功能.一般来说,使用这些组件的过程就包含在应用程序的逻辑语句之中.问题是,当这些组件想要做成类似插件功能,以达到应用程序的业务逻辑不变就能随意的更改组件的实现的效果.这种灵活性取决于应用程序如何组装这些组件.如果说应用程序依赖于这些组件的话,依赖注入就是把这些依赖关系从应用程序的

再说php依赖注入

前段时间,有朋友问我yii2的依赖注入是怎么个玩法,好吧, 经常看到却一直不甚理解的概念,这里我再对自己认识的依赖注入深刻的表达下我的理解,依赖注入(DI)以及控制器反转(Ioc). 依赖注入就是组件通过构造器,方法或者属性字段来获取相应的依赖对象. 举个现实生活中的例子来理解, 比如我要一把菜刀 如何获得1.可以自己造一把,对应new一个.2.可以找生产菜刀的工厂去买一把,对应工厂模式.3.可以打电话 让店家送货上门,对应依赖注入 依赖注入(DI)的概念虽然听起来很深奥,但是如果你用过一些新兴

谈谈php里的IOC控制反转,DI依赖注入

理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(Inversion of Control,缩写为IoC):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 依赖注入(Dependency Injection,简称DI):DI是IOC的一种实现,表现为:在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属

IoC容器Autofac正篇之依赖注入(六)

依赖注入,这个专业词我们可以分为两个部分来理解: 依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A: 注入,医生通过针头将药物注入到病人体内.注入也就是由外向内注入.灌输一些东西. 综合上面的说明,依赖注入就是A类依赖B类,B类的实例由外部向A注入而不是由A自己进行实例化或初始化. 三种注入方式 一.构造器注入   类A依赖于类B,类A的构造方法中,有一个参数为类B,在new 类A时会从外部为类B传入实例就是构造注入 cl

理解依赖注入(Dependency Injection)

理解依赖注入 Yii2.0 使用了依赖注入的思想.正是使用这种模式,使得Yii2异常灵活和强大.千万不要以为这是很玄乎的东西,看完下面的两个例子就懂了. class SessionStorage { function __construct($cookieName = 'PHP_SESS_ID') { session_name($cookieName); session_start(); } function set($key, $value) { $_SESSION[$key] = $valu

Spring.Net-DI依赖注入和Ioc控制反转

Spring.Core作为整个Spring框架的基础,实现了依赖注入的功能.Spring框架的其它模块都要依赖或扩展该模块. IObjectFactory接口,该接口实现了工厂模式,使用它可以帮我们创建对象,与具体的程序逻辑解耦. IApplicationContext是IObjectFactory的扩展,增加了许多企业级的功能,包括使用资源文件进行文本本地化,事件传播,资源装载等等. Spring.Net的配置 使用Spring.Net创建对象,需要在程序配置文件中配置   1:配置sprin

自定义Spring--DI依赖注入

1.框架思想 IoC(Inversion of Control,控制反转,反向控制),或者成为DI(Dependency Injection,依赖注入). 在传统程序中,相互的依赖性是固定在程序中的.程序的运行也是一步一步的,完全按照程序代码执行,根据代码就能知道程序怎样运行. 在Spring中程序间的依赖关系并不是直接写在程序中,而是配置在Spring文件中,有Spring在运行时配置的.在编译阶段,既没有实例化对象,也没有设置依赖关系,而是把依赖关系交给Spring,有Spring在运行阶段

Catel帮助手册-Catel.Core:(5)依赖注入(ServiceLocator and TypeFactory)

1,简介 在Catel2.0之前,IOC容器内部使用的是Unity,然而,这就强制所有的用户在他的应用程序中使用Unity作为IOC容器,也需要这样划分库,从2.0以后,一个不同的技术被使用了,这个允许开发者可以使用他们自己悬着的IOC容器技术. 1.1在Ioc中不同的组件 在Catel中有许多不同的组件他们对于Ioc是非常重要的. ServiceLocator 该组件用于注册所有的类型,这个事真正的Ioc容器 TypeFactory 用于创建类型的组件,使用IServiceLocator来获取