【问题标题】:Adapters and Dependency Injection适配器和依赖注入
【发布时间】:2012-10-30 12:44:45
【问题描述】:

我目前正在用 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);

由于应用程序使用前端控制器,因此会在那里创建一个 DI 容器。然后它会创建一个路由对象等。

  • 鉴于此,我是否应该将该容器的引用传递给 loginController 对象,然后使用该容器实例化我的适配器?

  • 或者我应该在我的 loginController 对象中实例化一个新容器,然后只加载适配器的一个实例?

【问题讨论】:

    标签: php dependency-injection adapter


    【解决方案1】:

    我会做第一个:将引用传递给您的控制器。您需要在应用程序中使用单个依赖注入器容器 (DIC)。您不想在需要访问时创建新的 DIC。这将导致存储在 DIC 中的对象重复。

    我知道 Symfony 2 就是这样做的。所有控制器(以及许多其他类)都实现了ContainerAware 接口。该接口有一个方法setContainer(),用于传递对 DIC 的引用。

    【讨论】:

    • 谢谢 :) 我创建了一个类似于 ContainerAware 的抽象类,其他类可以扩展。然后容器本身会在运行时自动注入到该类中。这似乎更整洁。
    【解决方案2】:

    我不知道您的特定 DI 工具,但从 DI 的角度来看,您将指定要使用的类型。容器本身负责实例化配置类型的新实例(可能还包括该类型的所有依赖项)。

    在您的示例中使用 DI 的好处是您可以使用不同的配置部署完全相同的代码,其中一个安装使用 LDAP,另一个安装使用 MySQL 身份验证。

    【讨论】:

      【解决方案3】:

      将类型提示 ("AbstractLoginAdapter") 重构为 ("MySQLLoginAdapter")。

      如果在新的__CLASS__ // Fatal Error中调用抽象类方法。

      【讨论】:

        猜你喜欢
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-30
        • 2021-11-19
        相关资源
        最近更新 更多