gpt4 book ai didi

php - 适配器和依赖注入(inject)

转载 作者:可可西里 更新时间:2023-11-01 00:51:17 26 4
gpt4 key购买 nike

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

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

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

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

然后我会像这样实现适配器:

<?php
MySQLLoginAdapter extends AbstractLoginAdapter{

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

一切都很好,但是我该如何创建适配器的实例呢?通常,依赖项将通过构造函数使用 yadif 注入(inject):

<?php
class loginController{

private $_adapter;

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

但是,由于我不知道将注入(inject)哪个具体适配器,所以我无法事先在配置中进行设置。 Yadif 允许我创建一个配置,然后我需要将其传递给容器:

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

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

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

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

最佳答案

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

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

关于php - 适配器和依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6663298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com