2014-03-27 57 views
0

我想在我的Yii 1.1.14項目中使用接口和依賴注入。下面是我的演示代碼:在Yii控制器中使用接口和DI

接口:

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的論壇同樣的問題,但我們最終兜兜:http://www.yiiframework.com/forum/index.php/topic/52810-using-interfaces-and-di-in-yii-controllers/

+1

Yii中最好是創建UserService作爲ApplicationComponent到處都使用這樣的Yii ::應用程序() - > userService沒有DI –

+0

現在,它可以輕鬆完成在Yii 2.檢查此:http://stackoverflow.com/questions/28753235/how-to-use-dependency-injection-on-yii2 – sudip

回答

1

這是不容易的使用依賴注入Yii中構架起尚未與想法創建使用它。

有一個擴展,讓你使用依賴注入:http://www.yiiframework.com/extension/yiipimple

我沒有帶試過,所以我不能告訴你,如果這個擴展回答您的需求。

+0

這看起來不像依賴注入,而是像服務位置。你最終從容器中取出東西,而不是將它們注入到控制器中。 –

+0

是的,這是真的。我認爲你不能在Yii中執行真正的依賴注入來修改框架的核心。 但我認爲這個服務定位器是你可以在Yii-1中獲得的最好的。您可以通過使用它來分離關注點。 – darkheir

+0

同意:)唯一的方法是通過擴展框架 –

1

這與Zend Framework 1的問題相同:框架使用構造函數,因此您不能將其用於依賴注入。

我在ZF1中集成PHP-DI所做的工作是覆蓋框架的「Dispatcher」,即負責創建控制器的對象。

通過覆蓋它,我可以控制如何創建控制器,從而注入依賴關係。

看一看這裏:https://github.com/mnapoli/PHP-DI-ZF1