mouf/pimple-interop

本项目是 Pimple 微型框架的一个非常简单的扩展。它增加了 Pimple 与 container-interop API 的兼容性。

v1.0.0 2014-08-24 17:16 UTC

This package is auto-updated.

Last update: 2024-09-15 04:36:53 UTC


README

Latest Stable Version Latest Unstable Version License SensioLabsInsight

本包包含一个对 Pimple DI 容器 的扩展,使 Pimple 1 兼容 container-interop API。

如何使用它?

您可以使用 PimpleInterop 类而不是 Pimple 类。这个类扩展了 PimplePimpleInterop 实现了 ContainerInterface。这意味着您可以通过使用 gethas 方法来访问您的 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 方法)。