Php 在Yii控制器中使用接口和DI
我想在我的Yii 1.1.14项目中使用接口和依赖注入。以下是我的演示代码: 界面: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"; } } 现在是对我来说有问题的部分。
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中最好的。您可以使用它来分离关注点。同意:)否则的唯一方法是扩展框架