Yii2通过__construct实现Interface依赖注入

作者:IT技术圈子 浏览量:347   发表于 2023-09-16 20:12 标签:

一、定义接口

新建frontend\libs\interfaces\ReqeustInterface,定义一个RequestInterface接口,该接口仅是定义需要是实现的方法,具体实现不通过interface

<?php
namespace frontend\libs\interfaces;

/**
 * 请求
 *
 * @package frontend\libs\interfaces
 */
interface RequestInterface
{
    /**
     * 获取时间戳
     *
     * @return int
     */
    public function getTimeStamp(): int;
}

二、定义接口类

新建frontend\components\Request,创建Request类,该类需要实现RequestInterface的所有方法

<?php

namespace frontend\components;

class Request extends \yii\web\Request implements \frontend\libs\interfaces\RequestInterface
{
    /**
     * 获取当前请求时间
     * @return int
     */
    public function getTimeStamp(): int
    {
        return time();
    }
}

三、依赖注入实现

在Yii2中,具体依赖注入的实现,可在入口文件中,通过Yii的$container的set方法,实现对指定的类注入,set方法的第一个参数为interface,第二个参数为实现该interface的类:frontend/web/index.php增加以下一行

\Yii::$container->set('frontend\libs\interfaces\RequestInterface', ['class'=>'frontend\components\Request']);

四、依赖注入使用

通过在入口文件中实现依赖注入后,在Controller中的__construct以Interface的方式注入即可直接对Request类的实例化,如:frontend\controllers\TestController:

<?php
namespace frontend\controllers;

use frontend\libs\interfaces\RequestInterface;
use Yii;
use yii\web\Controller;


class TestController extends Controller
{

    protected $request;

    public function __construct($id, $module, RequestInterface $request, array $config = [])
    {
        $this->request = $request;
        parent::__construct($id, $module, $config);
     }

    
    public function actionTest()  
    {
         var_dump($this->request->getTimeStamp());// 通过注入,这里就可以直接获取到请求类中的请求时间
     }
}