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); }
<?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; } }
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答