2011-07-12 57 views
3

我目前正在PHP中構建一個MVC應用程序(不使用任何框架)。我正在使用yadif(https://github.com/beberlei/yadif)進行依賴注入。適配器和依賴注入

我想構建一個登錄模塊。它應該能夠使用適配器,例如,可以設置使用MySql數據庫或某個LDAP目錄對登錄進行身份驗證。該設置將在管理區完成並存儲在數據庫中。

我想,我將有一個抽象適配器:

<?php 
abstract AbstractLoginAdapter{ 
    abstract function login($username, $pass){} 
} 

然後,我會只是實現像這樣的適配器:

<?php 
MySQLLoginAdapter extends AbstractLoginAdapter{ 

    public function login($username, $pass){ 
     //do stuff 
    } 
} 

這是所有好的和不好,但我怎麼創建一個實例的適配器?通常情況下,依賴性將會使用yadif通過構造方法注入:

<?php 
class loginController{ 

    private $_adapter; 

    public function __construct(AbstractLoginAdapter $adapter){ 
      $this->_adapter = $adapter; 
    } 
} 

然而,因爲我不知道哪一個具體的適配器將被注入做,我不能設置在手時的配置。 Yadif允許我創建的配置,然後我需要傳遞給容器:由於應用程序使用一個前端控制器

$builder = new Yadif_Builder(); 
$builder->bind("loginController") 
    ->to("loginController") 
    ->args($SelectedLoginAdapter); 

,二容器中創建那裏。然後創建一個路由對象等

  • 鑑於此,我要傳遞的容器裏給的LoginController對象的引用,然後使用該容器來實例化我的適配器?

  • 或者我應該在我的loginController對象中實例化一個新的容器,然後在適配器的實例中加載?

回答

2

我會做第一件事:將參考傳遞給您的控制器。您需要在應用程序中使用一個Dependency Injector Container(DIC)。無論何時需要訪問它,您都不想創建新的DIC。這會導致存儲在DIC中的對象重複。

我知道這是Symfony 2如何做到的。所有的控制器(和許多其他類)都實現了ContainerAware接口。該接口有一個單一的方法setContainer(),用於傳遞對DIC的引用。

+0

謝謝:)我創建了一個類似ContainerAware的抽象類,其他類可以擴展。容器本身會在運行時自動注入該類。這看起來很整潔。 – F21

2

我不知道您的具體DI工具,但從DI的角度來看,您將指定使用哪種類型。容器本身負責實例化已配置類型的新實例(可能還包括該類型的所有依賴項)。

在您的示例中,DI的好處是您可以使用LDAP進行1次安裝,另一次使用MySQL身份驗證,可以使用不同配置部署完全相同的代碼。

1

重構類型暗示("AbstractLoginAdapter")("MySQLLoginAdapter")

如果您在新的__CLASS__ // Fatal Error中調用抽象類的方法。