Yii2依赖注入示例

时间:2015-04-23 22:13:09

标签: php dependency-injection yii2

有人可以在Yii2中使用DI容器指向实际示例或教程的方向吗?

我一定很厚,但关于这个问题的2.0指南对我来说并不是那么清楚。此外,我审查的大多数在线教程和示例代码都充斥着Yii::$app单例,这使得测试变得困难。

3 个答案:

答案 0 :(得分:4)

例如,您有类\app\components\First\app\components\Second实现了一个接口\app\components\MyInterface

您可以使用DI容器仅在一个地方更改课程。例如:

class First  implements MyInterface{
    public function test()
    {
        echo "First  class";
    }
}
class Second implements MyInterface {
    public function test()
    {
        echo "Second  class";
    }
}

$container= new \yii\di\Container();
$container->set ("\app\components\MyInterface","\app\components\First");

现在,在调用$container->get("\app\components\MyInterface");

时,您会给出First类的实例
$obj = $container->get("\app\components\MyInterface");
$obj->test(); // print "First  class"

但是现在我们可以为这个界面设置其他类了。

$container->set ("\app\components\MyInterface","\app\components\Second");
$obj = $container->get("\app\components\MyInterface");
$obj->test(); // print "Second class"

您可以在一个地方设置类,其他代码将自动使用新类。

Here您可以在Yii中找到有关此模式的优秀文档,并附带代码示例。

答案 1 :(得分:2)

这是设置默认小部件设置的简单示例:

        // Gridview default settings
        $gridviewSettings = [
            'export' => false,
            'responsive' => true,
            'floatHeader' => true,
            'floatHeaderOptions' => ['scrollingTop' => 88],
            'hover' => true,
            'pjax' => true,
            'pjaxSettings' => [
                'options' => [
                    'id' => 'grid-pjax',
                ],
            ],
            'resizableColumns' => false,
        ];

        Yii::$container->set('kartik\grid\GridView', $gridviewSettings);

答案 2 :(得分:0)

我有一些相似的要求,我想用Yii2开始新项目,因为 生产就绪,但最终我将在yii3投入生产后再使用。为了使迁移更容易,建议从yii中使用依赖项注入替换Yii :: $ app,这是我需要为要在控制器中使用的组件实现依赖项注入的地方。

这是我的组成部分。

<?php

namespace common\services;

use Yii;
use yii\base\Component;

class HelloService extends Component
{
    public function welcome() {
        echo "Welcome from service component";
    }
}

这是我的控制器使用上面的组件,并通过依赖项注入对其进行访问。

<?php
namespace console\controllers;

use yii\console\Controller;
use common\services\HelloService;

class HelloController extends Controller
{
    public $message;
    /** @var common\services\HelloService $helloService */
    private $helloService;

    public function __construct($id, $module, HelloService $helloService, $config = [])
    {
        $this->helloService = $helloService;
        parent::__construct($id, $module, $config);
    }
    
    public function actionIndex()
    {
        echo $this->helloService->welcome() . "\n";
    }
}