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; } }
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答