Php 在Yii控制器中使用接口和DI

Php 在Yii控制器中使用接口和DI,php,yii,interface,dependency-injection,Php,Yii,Interface,Dependency Injection,我想在我的Yii 1.1.14项目中使用接口和依赖注入。以下是我的演示代码: 界面: interface IUserInterface { public function DoSomething(); } 班级: class UserService implements IUserInterface { public function DoSomething() { echo "TEST TEST"; } } 现在是对我来说有问题的部分。

我想在我的Yii 1.1.14项目中使用接口和依赖注入。以下是我的演示代码:

界面:

interface IUserInterface
{   
    public function DoSomething();
}
班级:

class UserService implements IUserInterface
{
    public function DoSomething()
    {
        echo "TEST TEST";
    }
}
现在是对我来说有问题的部分。如何在控制器中注入接口

我试过这个:

class AccountController extends Controller
{       
    protected $userService;

    public function __construct(IUserInterface $userInterface) 
    {
        $this->userService = $userInterface;

        parent::__construct();
    }    

    public function actionTest()
    {
        $this->userService->DoSomething();
    }
}
但这不起作用,因为CController构造函数:

public void __construct(string $id, CWebModule $module=NULL)
我应该怎么做,这样我才能使用控制器中的接口


我在Yii论坛上问了同样的问题,但我们最终还是兜了个圈子:

在Yii中使用依赖注入并不容易,因为框架的创建并没有使用它的想法

有一个扩展允许您使用依赖项注入:


我还没有尝试过,所以我无法告诉您此扩展是否满足您的需求。

Zend Framework 1也存在同样的问题:该框架使用构造函数,因此您无法将其用于依赖项注入

我在ZF1中集成PHP-DI所做的是重写框架的“分派器”,即负责创建控制器的对象

通过重写它,我可以控制如何创建控制器,从而注入依赖项


看看这里:

在Yii中,最好将您的用户服务创建为应用程序组件,并像这样在任何地方使用Yii::app()->UserService,无需DINow,在Yii 2中就可以轻松完成。检查这个:这看起来不像依赖注入,而是像服务位置。你最终从容器中取出东西,而不是将它们注入控制器。是的,这是真的。我认为,如果不修改框架的核心,就无法在Yii中执行真正的依赖注入。但我认为这个服务定位器是Yii-1中最好的。您可以使用它来分离关注点。同意:)否则的唯一方法是扩展框架