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;
}
}