Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 适配器和依赖注入_Php_Dependency Injection_Adapter - Fatal编程技术网

Php 适配器和依赖注入

Php 适配器和依赖注入,php,dependency-injection,adapter,Php,Dependency Injection,Adapter,我目前正在用PHP构建一个MVC应用程序(不使用任何框架)。我用的是yadif(https://github.com/beberlei/yadif)用于依赖项注入 我想建立一个登录模块。它应该能够使用适配器,例如,可以设置使用MySql数据库或某些LDAP目录对登录进行身份验证。此设置将在管理区域中完成,并存储在数据库中 我想我会有一个抽象适配器: <?php abstract AbstractLoginAdapter{ abstract function login($user

我目前正在用PHP构建一个MVC应用程序(不使用任何框架)。我用的是yadif(https://github.com/beberlei/yadif)用于依赖项注入

我想建立一个登录模块。它应该能够使用适配器,例如,可以设置使用MySql数据库或某些LDAP目录对登录进行身份验证。此设置将在管理区域中完成,并存储在数据库中

我想我会有一个抽象适配器:

<?php 
abstract AbstractLoginAdapter{
    abstract function login($username, $pass){}
}
由于应用程序使用前端控制器,因此在那里创建了DI容器。然后创建一个路由对象等

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

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


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


在您的示例中,DI的好处是,您可以使用不同的配置部署完全相同的代码,其中一个安装使用LDAP,另一个安装使用MySQL身份验证。您需要在应用程序中使用一个依赖注入容器(DIC)。您不希望在需要访问时创建新的DIC。这将导致DIC中存储的对象重复


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

重构类型提示
(“AbstractLoginAdapter”)
(“MySQLLoginAdapter”)

如果您在新的
\uu class\uu//Fatal Error

中调用抽象类方法,谢谢:)我创建了一个类似于ContainerWare的抽象类,其他类可以扩展它。然后,容器本身在运行时自动注入该类。这看起来要整洁得多。
<?php
MySQLLoginAdapter extends AbstractLoginAdapter{

    public function login($username, $pass){
        //do stuff
    }
}
<?php
class loginController{

    private $_adapter;

    public function __construct(AbstractLoginAdapter $adapter){
          $this->_adapter = $adapter;
    }
}
$builder = new Yadif_Builder();
$builder->bind("loginController")
    ->to("loginController")
    ->args($SelectedLoginAdapter);