有人可以在Yii2中使用DI容器指向实际示例或教程的方向吗?
我一定很厚,但关于这个问题的2.0指南对我来说并不是那么清楚。此外,我审查的大多数在线教程和示例代码都充斥着Yii::$app
单例,这使得测试变得困难。
答案 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");
$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";
}
}