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;

	 		} 		

}




  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值