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