如何使用 PHP 实现工厂类 - 依赖注入

2024-01-08

以下面的代码作为我想要的示例:

class SomethingController extends Factory    
{
    private $somethingRepository;

    public function __Construct( ISomethingRepository $repo )
    {
        $this->somethingRepository = $repo;
    }
}

class Factory
{        
    public function __Construct()
    {
        // The following call to AddBinding would push into SomethingController the new instance of the class denoted in my AddBinding second parameter.
        $this->AddBinding( ISomethingRepository, MySQLSomethingRepository);
        // So in this case, if the controller i'm extending has a construct parameter of ISomethingRepository, then make the parameter equal a new MySQLSomethingRepository()
        // Then if I want to use JSONSomethingRepository in the future, I only have to change the one AddBinding call and the controller will still work.
    }

    public function AddBinding( $interface, $concrete )
    {
        // Somehow assign the constructor properties of the extending class as new instances of the bindings i have called upon in the construct of my factory class (see this class's construct)
        // Pseudo code:
        // ----------------------
        $calledClass = get_called_class();
        $class = new \ReflectionClass( $calledClass );

        $method = $class->getMethod( "__construct" );

        $params = $method->getParameters();

        foreach( $params as $param )
        {
            if ( $param == $interface )
            {
                return new $concrete;
            }
        }
        // /Pseudo code:
        // ----------------------
    }
}  

我想实现一个工厂类。

  • 该工厂类将由控制器类扩展。
  • 工厂类将查看控制器类的构造参数,并根据工厂中的 AddBindings 方法创建对象的新实例。

假设我想要一个 MySQLSomethingRepository,其中包含来自 MySQL 的数据...注入到我的 SomethingController 中...我需要在某个地方声明这一点

SomethingController( new MySQLSomethingRepository() )... 

希望这将由我的工厂类处理......

我目前的做法是强制与数据源直接耦合......这使得很难使用以下方法进行测试用例:

private $somethingRepository = new MySQLSomethingRepository();

所以想象一下,如果我在其他控制器的负载中使用了相同的存储库,并且我想将我的数据库源更改为一些 json 数据,并且我实现了以下存储库“JsonSomethingRepository”,我必须将所有控制器更改为:

private $somethingRepository = new JsonSomethingRepository();

我如何实现我的 Factory 类,以便它可以处理创建我的控制器类在 AddBindings 函数中所需的实例?


在Adapter模型中设计一个抽象类,并为子类提供一些通用方法。 您可以使用适配器设计这两个存储库以注入控制器中。

我的建议是使用抽象类并按以下方式执行:

class SomethingController extends AbstractController {
}

abstract class AbstractController {
    protected $somethingRepository;
    public function __Construct(ISomethingRepository $repo) {
        $this->somethingRepository = $repo;
        $this->AddBinding ( ISomethingRepository, MySQLSomethingRepository );
    }
    public function AddBinding($interface, $concrete) {
        // Somehow assign the constructor properties of the extending class as new instances of the bindings i have called upon in the construct of my factory class (see this class's construct)
    }
}

希望它会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PHP 实现工厂类 - 依赖注入 的相关文章

  • 如何编写在正文中包含锚标记的 Zend Framework URL?

    使用 Zend Framework 中设置的标准 MVC 我希望能够显示始终具有锚点的页面 现在我只是在 phtml 文件中添加一个带有 anchor 的无意义参数
  • 使用 DOJO 自动完成文本框

    我正在寻找一种使用 DOJO 进行文本框自动建议的简单方法 我将查询的数据库表 使用 PHP 脚本 以 JSON 形式返回 有超过 100 000 条记录 因此这确实不应该采用 FilteringSelect 或 ComboBox 的形式
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 通过JS Laravel访问存储目录

    有没有办法访问storage目录 该目录已经链接到publicJS 中的目录 我正在尝试制作一个上传图片的表单 验证脚本 if request gt hasFile photos marker gt photos request gt ph
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 如何在 BenchmarkDotNet 中使用 DependencyInjection?

    我想在我现在正在使用的一些遗留代码上使用 BenchmarkDotNet 它是用 C Net462 编写的 这是一个庞大 古老且复杂的系统 我想对某些特定类中的一些方法进行基准测试 这些类使用依赖注入 我不确定如何做到这一点 到目前为止我看
  • PHP cURL 在本地工作,在 AWS 服务器上出现错误 77

    最新更新 脚本作为管理员用户通过 SSH shell 作为 php script php 成功运行 当由 nginx 用户运行时 curl 命令无法执行 https 请求 所以我猜测这是nginx用户无法正确使用curl的问题 我已经检查了
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将
  • 如何确定当前使用哪个网格选项

    我将 Bootstrap 3 用于使用 PHP 和 HTML 创建的网页 随着响应式网格和类的开启引导程序3您可以将多个类分配给一个 div 以根据当前屏幕尺寸定义不同的宽度 例如 div class col lg 3 col md 3 c
  • 如何在 WordPress 中按类别获取所有帖子

    我想在 WordPress 中按类别获取帖子 args array post type gt project postslist get posts args 0 gt WP Post 对象 ID gt 421 post author gt
  • jquery上传完成后重定向到新页面

    我正在尝试让这个 jquery 工具与我的网站一起使用以进行文件上传 https github com blueimp jQuery File Upload https github com blueimp jQuery File Uplo
  • 将数据库中的用户 ID 添加到 Codeigniter 中的会话数据中?

    我是 CodeIgniter 的新手 在从数据库添加用户 ID 用户登录后 到会话数据时遇到问题 这是我的代码问题 之前可能会在 SOF 上被问到 在付出了所有努力之后 我问这个 登录模型
  • PHP使用auto_increment生成短唯一ID?

    我想生成一个简短的 唯一的 ID 而不必检查冲突 我目前正在做类似的事情 但是我当前生成的 ID 是随机的 并且在循环中检查冲突很烦人 并且如果记录数量显着增加 将会变得昂贵 通常担心冲突不是问题 但我想要生成的唯一 ID 是一个由 5 8
  • 模拟/存根在 PHPUnit 中实现 arrayaccess 的类的对象

    这是我正在为其编写测试套件的类的构造函数 它扩展了 mysqli function construct Config c store config file this gt config c do mysqli constructor pa
  • 我怎样才能让这个脚本在 WordPress 上运行?

    我有这个脚本 document ready function text1 click function this hide 代码html div class div1 p class text1 text to appear when th
  • PHP 错误:“无法通过引用传递参数 2”

    我只是需要有关这个 PHP 错误的帮助 我不太明白 致命错误 无法在第 13 行 web stud openup inactivatesession php 中通过引用传递参数 2
  • 更改API数据输出的布局

    我是 API 集成和 PHP 的新手 我最近将 VIN 解码器集成到我的应用程序中 在输入框中输入车辆的 VIN 选择提交 然后就会显示 API 数据库中有关该车辆的所有信息 数据存储为关联数组 其中包含类别及其相应元素 例如 对于 VIN
  • 使用 PHP 和 OAuth 访问 SkyDrive

    我想使用 PHP 访问 skyDrive 我想检索文件和文件夹列表 下载 上传和删除文件 我有一个 microsoft dev clientID 和 clientSecret 有人可以帮助我开始使用 OAuth 连接到 skyDrive 并
  • Doctrine DQL 从 join 返回平面数组

    我通过 DQL 中的常规 LEFT JOIN 选择 3 个实体 它们通过连接表关联 连接表还定义了实体以及带注释的关系 查询执行没有问题 但我的结果作为平面数组返回 我期望一个包含三个实体作为每个索引的数组元素的数组 SELECT e1 e
  • 如何在数据列表 HTML PHP 中设置选择

    您好我想知道是否有一种方法可以在数据列表中设置选定的值 我想要这样的东西

随机推荐

  • 有什么方法可以捕获代码级别的 AWS lambda 超时错误吗?

    有什么办法可以捕捉到AWS lambda timed out代码级别的错误 以便我有机会在退出之前处理错误lambda功能 虽然 lambda 环境不会触发 超时 事件 但您可以自己轻松完成此操作 每种语言都有一个由context目的 到获
  • 如何用VBA获取Excel中用户的语言?

    我需要通过 VBA 获取 Excel 中的用户语言 因为 Excel 不会自动翻译数据透视表 并且我正在数据透视表中进行搜索VBA 刚刚发现德语中的枢轴看起来像这样 而在英语中它是这样的 我可以考虑一个选项 写一个 VLOOKUP Exce
  • 不使用OpenGL的Linux基础图形编程

    对于学习者来说 开始使用 C C 2D 和 3D 进行基本图形编程有哪些好的选择 我想尝试一下书中给出的东西 3D 数学入门 https rads stackoverflow com amzn click com 1568817231 显然
  • 根据另一列中自动完成的结果更改 jqGrid 文本列的可编辑属性

    我正在使用带有内联编辑功能的 jqGrid 4 4 0 为了这个问题 我的网格有四列 一个 ID 列 SomeGridRowId 一个带有 jQ uery 自动完成功能的文本列 Autocomplete 一个单字符文本列 SingleCha
  • Formsheet ios 8 约束与 iphone 约束相同

    我遇到这个问题 ios 8 中的表单采用 紧凑 宽度常规 高度 即所有 iPhone 约束 设置的约束 而不是 任何 任何 或 常规 宽度常规 高度 我对 iPhone 和 iPad 有两种不同的设计 因为表单正在消耗 iPhone 的约束
  • Ember.js:折叠/推迟昂贵的观察者或计算属性

    在 Ember 应用程序中 假设您有一个观察者或一个观察数组的属性 如下所示 topContributor function loop over articles hence slow property email protected cd
  • 如何获取我的应用程序的“可用”处理器数量?

    我知道如何获取计算机上的物理处理器数量和逻辑处理器数量 但我想知道我的应用程序可以访问多少个逻辑处理器 例如 我在四核机器上进行开发 但我有许多单核用户 并且在许多情况下我 简化 了界面 或者遇到了多核系统从未遇到过的锁定问题 因此 为此
  • flutter 中 UniqueKey 的范围是什么?

    我是一个独特的人 我的意思是我与其他人不同在这世上 当我在flutter中创建UniqueKey时 什么是world它与其他的有何不同 A UniqueKey其唯一性与每个实例化对象都是一个单独的对象完全相同 并没有什么神奇之处实施Uniq
  • 在模拟器 Swift 上运行自定义键盘时出错

    我正在尝试制作自定义键盘 对于简单的自定义键盘 它运行良好 但是在单击表情符号时 它显示以下错误 viewServiceDidTerminateWithError 错误域 UIViewServiceInterfaceErrorDomain
  • Google PubSub Python 多个订阅者客户端接收重复消息

    我有一个非常简单的应用程序 可以启动 PubSub 订阅者 StreamingPull 客户端 我已将其部署在 Kubernetes 上 以便可以扩展 当我部署一个 Pod 时 一切都会按预期进行 当我扩展到 2 个容器时 我开始收到重复的
  • 棒棒糖主题问题

    我在我的项目中使用 sherlock 操作栏 我使用了 Theme Sherlock Light DarkActionBar
  • 努力让 Boost 库单元测试框架正常工作

    我已经使用 VS2013 成功构建了 Boost 库 我还成功地包含并使用了一些 Boost Filesystem 和 Boost Log 的东西 但是 我正在努力让以下单元测试在 Visual Studio 2013 中运行 define
  • Project Loom:使用虚拟线程时,是什么让性能更好?

    为了提供一些背景信息 我关注 Loom 项目已经有一段时间了 我读过了Loom 的状态 http cr openjdk java net 7Erpressler loom loom sol1 part1 html why 我做过异步编程 异
  • 什么是主要类型?

    OCaml 编译器有一个 principal 选项 邮件列表中有时会提到术语 principal type 它到底是什么意思 维基百科中的定义是递归的 因为它假设读者已经熟悉这个概念 类型推断的过程就是猜测给定用户编写的程序 该程序的类型是
  • 将两个 ArrayList 添加到一个哈希图 ArrayList

    我有两个ArrayList我想做一个ArrayList通过添加它们 两个列表具有相同的大小 我打算这样做 这是优化的还是当列表变大时我可以让它变得更好 更高效 i e private ArrayList
  • Material UI:样式闪烁然后消失

    在此 SSR 应用程序的以下代码中 样式可能会出现 50 毫秒并消失 我很好奇是什么原因造成的 This component is a child of index tsx in the pages folder
  • GitHub - 如何从一个分支创建两个拉取请求

    我已经分叉了一个开源存储库 在我的分叉上编写了数千行代码 并在原始项目上创建了拉取请求 与此同时 我修复了另一个与我的第一个拉取请求完全无关的错误 我想专门针对此错误创建第二个拉取请求 它不包含第一个拉取请求中的任何工作 不需要我再次分叉存
  • 在Java中模拟鼠标在非活动窗口的某个位置单击?

    不管怎样 我正在构建一个在后台运行的机器人 这个机器人需要我点击 当然 我希望能够在机器人运行时做其他事情 所以我想知道是否可以在非活动窗口的某个位置模拟鼠标单击 如果可能的话 如果你们中有人能帮助我 我将不胜感激 java awt Rob
  • 在 Xamarin 中创建自定义控件

    我正在将我的应用程序从 Windows Phone 8 移植到 Android 并且我需要创建一些自定义 UI 控件 我尝试创建一个 XML 布局 在其中创建一个 LinearLayout 作为控件 然后动态添加它 根据用户的意愿 但这不起
  • 如何使用 PHP 实现工厂类 - 依赖注入

    以下面的代码作为我想要的示例 class SomethingController extends Factory private somethingRepository public function Construct ISomethin