trigig / pimple_fixed
Pimple 是一个简单的 PHP 5.3 依赖注入容器
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-24 07:47:35 UTC
README
注意!
这是 Pimple 2.x 的文档。如果你正在使用 Pimple 1.x,请阅读 Pimple 1.x 文档。阅读 Pimple 1.x 代码也是了解如何创建简单的依赖注入容器(Pimple 2.x 实现更注重性能)的好方法。
Pimple 是一个由一个文件和一个类组成的简单 PHP 依赖注入容器(约 80 行代码)。
安装
要将 Pimple 包含到你的项目中,将其添加到你的 composer.json
文件中
{ "require": { "pimple/pimple": "~2.1" } }
Pimple 也可以作为 PHP C 扩展提供
$ cd ext/pimple
$ phpize
$ ./configure
$ make
$ make install
使用
创建一个容器只需要实例化 Container
类
use Pimple\Container; $container = new Container();
注意
在 Pimple 2.0 中,类 Pimple\Container
被命名为 Pimple
(已自动注册一个类别名以保持向后兼容性,但你应该升级你的代码。)
与许多其他依赖注入容器一样,Pimple 可以管理两种不同的数据:服务 和 参数。
定义参数
定义参数就像使用 Pimple 实例作为一个数组一样简单
// define some parameters $container['cookie_name'] = 'SESSION_ID'; $container['session_storage_class'] = 'SessionStorage';
定义服务
服务是一个对象,它在更大系统中执行某些操作。服务的示例:数据库连接、模板引擎、邮件发送器。几乎任何对象都可以是服务。
服务通过返回对象实例的匿名函数定义
// define some services $container['session_storage'] = function ($c) { return new $c['session_storage_class']($c['cookie_name']); }; $container['session'] = function ($c) { return new Session($c['session_storage']); };
注意,匿名函数可以访问当前容器实例,允许引用其他服务或参数。
由于对象只有在获取它们时才会被创建,所以定义的顺序并不重要,也没有性能损失。
使用已定义的服务也很简单
// get the session object $session = $container['session']; // the above call is roughly equivalent to the following code: // $storage = new SessionStorage('SESSION_ID'); // $session = new Session($storage);
保护参数
由于 Pimple 将匿名函数视为服务定义,你需要使用 protect()
方法将它们包装起来以将它们存储为参数
$container['random'] = $container->protect(function () { return rand(); });
在创建后修改服务
在某些情况下,你可能想在定义后修改服务定义。你可以使用 extend()
方法定义在创建服务后运行的附加代码
$container['mail'] = function ($c) { return new \Zend_Mail(); }; $container->extend('mail', function($mail, $c) { $mail->setFrom($c['mail.default_from']); return $mail; });
第一个参数是对象的名称,第二个参数是一个函数,该函数可以访问对象实例和容器。
获取服务创建函数
当你访问一个对象时,Pimple 会自动调用你定义的匿名函数,为你创建服务对象。如果你想获取对这个函数的原始访问,可以使用 raw()
方法
$container['session'] = function ($c) { return new Session($c['session_storage']); }; $sessionFunction = $container->raw('session');
扩展容器
.. versionadded:: 2.1 Support for extending a container was introduced in Pimple 2.1.
如果你反复使用相同的库,你可能希望从一个项目到另一个项目重用一些服务;通过实现 Pimple\ServiceProviderInterface
将你的服务打包到一个 提供者 中
use Pimple\Container; class FooProvider implements Pimple\ServiceProviderInterface { public function register(Container $pimple) { // register some services and parameters // on $pimple } }
然后,该提供者可以轻松地注册到容器中
$pimple->register(new FooProvider());
定义工厂服务
默认情况下,每次你获取一个服务时,Pimple 都返回相同的实例。如果你想为所有调用返回不同的实例,请使用 factory()
方法将你的匿名函数包装起来
$container['session'] = $container->factory(function ($c) { return new Session($c['session_storage']); });