YII2依赖注入和事件的使用

末蓝、 2022-08-02 12:49 214阅读 0赞

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

eg:

  • IOC又称DI(依赖注入)*

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

IUserService.php

  1. <?php
  2. namespace frontend\service;
  3. /**
  4. * 用户业务逻辑接口
  5. */
  6. interface IUserService{
  7. public function getAllUsers();
  8. public function getUserById($id);
  9. }

IUserServiceimpl.php 接口实现类

  1. <?php
  2. namespace frontend\service;
  3. use frontend\models\User;
  4. use yii\base\Object;
  5. /**
  6. *用户业务逻辑实现
  7. *实现用户业务逻辑接口
  8. *
  9. */
  10. class IUserServiceimpl extends Object implements IUserService{
  11. public function __construct()
  12. {
  13. parent::__construct();
  14. }
  15. public function getAllUsers(){
  16. //$list = User::find()->asArray()->all();
  17. //$user = new User();
  18. $list = User::getInstance()->getAllUsers();
  19. return $list ? $list : [];
  20. }
  21. public function getUserById($id){
  22. return User::findOne($id);
  23. }
  24. }

Model层User.php

  1. <?php
  2. namespace frontend\models;
  3. use yii\base\Model;
  4. use yii\db\ActiveRecord;
  5. use Yii;
  6. use frontend\models\Order;
  7. use yii\web\IdentifyInterface;
  8. class User extends ActiveRecord
  9. {
  10. // 第一步:定义自己的事件
  11. const EVENT_BEFORE_MARK_QUERY = 'beforeMarkDelete';
  12. const EVENT_AFTER_MARK_QUERY = 'afterMarkDelete';
  13. // 第一步:在初始化阶段绑定事件和Event Handler
  14. public function init()
  15. {
  16. parent::init();
  17. $this->trigger(self::EVENT_INIT);
  18. // 完成绑定
  19. $this->on(self::EVENT_BEFORE_MARK_QUERY, [$this, 'onBeforeMarkQuery']);
  20. $this->on(self::EVENT_AFTER_MARK_QUERY,[$this,'onAfterMarkQuery']);
  21. }
  22. // 第二步:定义Event Handler
  23. public function onBeforeMarkQuery () {
  24. echo "我在查询之前进行了拦截"."<br>";
  25. //exit;
  26. }
  27. // 第二步:定义Event Handler
  28. public function onAfterMarkQuery () {
  29. echo "查询完了,想返回数据,别想,数据就在上面,去拿吧";
  30. exit;
  31. }
  32. /**
  33. * 获取所有用户信息
  34. */
  35. public function getAllUsers(){
  36. // 触发事件
  37. $this->trigger(self::EVENT_BEFORE_MARK_QUERY);
  38. $list = static::find()->asArray()->all();
  39. echo "<pre>";
  40. print_r($list);
  41. $this->trigger(self::EVENT_AFTER_MARK_QUERY);
  42. }
  43. /**
  44. * 实例化User对象
  45. * @return User
  46. */
  47. public static function getInstance(){
  48. return new self;
  49. }
  50. /**
  51. * 返回表名
  52. */
  53. public static function tabName(){
  54. return 'user';
  55. }
  56. /**
  57. * 返回当前的数据库连接信息
  58. */
  59. public static function getDBInfo(){
  60. return parent::getDb();
  61. }
  62. }

接下来对接口的实现进行配置:

在入口文件index.php里面配置

  1. <?php
  2. defined('YII_DEBUG') or define('YII_DEBUG', true);
  3. defined('YII_ENV') or define('YII_ENV', 'dev');
  4. require(__DIR__ . '/../../vendor/autoload.php');
  5. require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
  6. require(__DIR__ . '/../../common/config/bootstrap.php');
  7. require(__DIR__ . '/../config/bootstrap.php');
  8. $config = yii\helpers\ArrayHelper::merge(
  9. require(__DIR__ . '/../../common/config/main.php'),
  10. require(__DIR__ . '/../../common/config/main-local.php'),
  11. require(__DIR__ . '/../config/main.php'),
  12. require(__DIR__ . '/../config/main-local.php')
  13. );
  14. // 注册一个接口
  15. Yii::$container->set('frontend\\service\\IUserService', 'frontend\\service\\IUserServiceimpl');
  16. // 注册一个别名
  17. Yii::$container->set('userservice','frontend\\service\\IUserService');
  18. //定义路径别名
  19. Yii::setAlias('@getuser' , 'index.php?r=face/getusers ');
  20. //加载配置文件
  21. $application = new yii\web\Application($config);
  22. $application->run();

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

  1. <?php
  2. namespace frontend\controllers;
  3. use Yii;
  4. use frontend\service\IUserService;
  5. use yii\web\Controller;
  6. use yii\di\Container;
  7. use yii\helpers\ArrayHelper;
  8. use frontend\models\UserForm;
  9. class FaceController extends Controller{
  10. private $userService;
  11. public function __construct($id, $module,$config = []){
  12. //DI容器获取实例化的对象
  13. //$this->userService = \Yii::$container->get('userservice');
  14. //Service Locator通过 Yii::createObject() 来获取实例, 而这个 Yii::createObject()
  15. //是调用了DI容器的 yii\di\Container::get() 来向 Yii::$container 索要实例的。
  16. // 因此,Service Locator最终是通过DI容器来创建、获取实例的。
  17. $this->userService = \Yii::createObject('userservice');
  18. parent::__construct($id, $module,$config);
  19. }
  20. /**
  21. * @inheritdoc
  22. */
  23. public function actions()
  24. {
  25. return [
  26. 'error' => [
  27. 'class' => 'yii\web\ErrorAction',
  28. ],
  29. 'captcha' => [
  30. 'class' => 'yii\captcha\CaptchaAction',
  31. 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
  32. ],
  33. ];
  34. }
  35. /**
  36. * 获取所有用户
  37. *
  38. */
  39. public function actionGetusers(){
  40. $list = $this->userService->getAllUsers();
  41. echo "<pre>";
  42. print_r($list);
  43. exit;
  44. }
  45. public function actionGetuserbyid(){
  46. $user = $this->userService->getUserById('2');
  47. $user = ArrayHelper::toArray($user);
  48. echo "<pre>";
  49. print_r($user);
  50. exit;
  51. }
  52. }

Center

发表评论

表情:
评论列表 (有 0 条评论,214人围观)

还没有评论,来说两句吧...

相关阅读

    相关 YII2依赖注入事件使用

    YII2的核心就是依赖注入和事件处理,同Spring的IOC和AOP功能基本是一样的,YII的依赖注入可以使得我们使用对象的时候,YII的容器帮助我们创建大大提高了效率,并且,

    相关 依赖注入2-DI

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用“好莱坞原则”是应用程序以被动的方式实现对流程的定制。我们可以采用若干