mouf / pimple-interop
本项目是 Pimple 微型框架的一个非常简单的扩展。它增加了 Pimple 与 container-interop API 的兼容性。
Requires
- container-interop/container-interop: ~1.0
- pimple/pimple: ~1.0
Requires (Dev)
- phpunit/phpunit: ~3.7
This package is auto-updated.
Last update: 2024-09-15 04:36:53 UTC
README
本包包含一个对 Pimple DI 容器 的扩展,使 Pimple 1 兼容 container-interop API。
如何使用它?
您可以使用 PimpleInterop
类而不是 Pimple
类。这个类扩展了 Pimple
。 PimpleInterop
实现了 ContainerInterface
。这意味着您可以通过使用 get
和 has
方法来访问您的 Pimple 条目。PimpleInterop
构造函数接受一个可选的 "root" 容器作为第一个参数。这意味着您可以将 PimpleInterop
与另一个容器连接起来。依赖项将从 "root" 容器而不是从 PimpleInterop
中获取。
以下是一个将 2 个 Pimple 实例链接起来的示例(在实际应用中,您更愿意将 Pimple 与一个包含所有正在使用的 DI 容器的组合容器连接起来)
// Let's declare a first container $pimpleParent = new PimpleInterop(); $pimpleParent['hello'] = 'world'; // Let's declare another container // Please note the "parent" container is passed in parameter of the constructor. $pimple = new PimpleInterop($pimpleParent); $pimple['test']->share(function(ContainerInterop $container) { return "Hello ".$container->get('hello'); }); // Prints "Hello world". echo $pimple->get('test'); // Prints "Hello world" too. echo $pimple['test'];
为什么需要这个包?
该包是长期努力的一部分,旨在实现 DI 容器之间的互操作性。最终目标是确保多个容器可以通过共享条目(一个容器可能使用来自另一个容器的条目等)相互通信。
我们不是已经可以用 Acclimate 做到这一点了吗?
出色的 Acclimate 库 可以在 Pimple 周围提供一个适配器。该适配器实现了 ContainerInterface
。
然而,适配器设计模式不能用来让 Pimple 将其依赖项获取委托给另一个容器。实际上,要实现此功能,需要修改容器的行为,而适配器设计模式并不总是适合这种情况。
此外,还有其他情况,适配器设计模式不足以应对。例如,Silex MVC 微型框架直接扩展了 Pimple 类。我们可以通过轻松地将 PimpleInterop 替换为 Pimple 来分叉 Silex MVC 微型框架。然而,Silex 使用适配后的 Pimple 实例从 Acclimate 中使用几乎是不可能的(因为 Silex 依赖于适配器未实现的所有 Pimple 方法)。