首页 > 编程 > PHP > 正文

YII2依赖注入和事件的使用

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

    eg:

    IOC又称DI(依赖注入)

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

    IUserService.php

    <?phpnamespace frontendservice;	/**	 * 用户业务逻辑接口	 */    interface IUserService{    	html' target='_blank'>public function getAllUsers();    	    	public function getUserById($id);    } 

    IUserServiceimpl.php 接口实现类

    <?php namespace frontendservice;use frontendmodelsUser;use yiiaseObject;	/**	 *用户业务逻辑实现	 *实现用户业务逻辑接口	 * 	 */   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 frontendmodels;use yiiaseModel;use yiidbActiveRecord;use Yii;use frontendmodelsOrder;use yiiwebIdentifyInterface;      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里面配置

    <?phpdefined('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 = yiihelpersArrayHelper::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 yiiwebApplication($config);$application->run();

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

    <?php namespace frontendcontrollers;use Yii;use frontendserviceIUserService;use yiiwebController;use yiidiContainer;use yiihelpersArrayHelper;use frontendmodelsUserForm;	 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容器的 yiidiContainer::get() 来向 Yii::$container 索要实例的。	 				// 因此,Service Locator最终是通过DI容器来创建、获取实例的。	 				$this->userService = Yii::createObject('userservice');	 				parent::__construct($id, $module,$config);	 		}			/**		     * @inheritdoc		     */    		    public function actions()		    {		        return [		            'error' => [		                'class' => 'yiiwebErrorAction',		            ],		            'captcha' => [		                'class' => 'yiicaptchaCaptchaAction',		                '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;	 		} 		}


    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表