Yii2通过__construct实现Interface依赖注入
一、定义接口
新建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());// 通过注入,这里就可以直接获取到请求类中的请求时间
}
}