2011-07-12 32 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中调用抽象类的方法。