mnapoli / simplex
支持完整容器互操作的Pimple分支
Requires
- php: >=5.3.0
- container-interop/service-provider: ~0.4.0
- psr/container: ^1.0
Requires (Dev)
- phpunit/phpunit: ~4.0
README
Simplex
Simplex 是一个 Pimple 3 分支,完全符合 PSR-11 规范,并支持 跨框架服务提供者。
Simplex 是一个用于 PHP 的小型依赖注入容器。
与 Pimple 的区别
Simplex 是 Pimple 代码的分支。唯一的区别如下
Simplex\Container
实现ContainerInterface
,这意味着以下方法存在$container->get($id)
是$container[$id]
的别名$container->has($id)
是isset($container[$id])
的别名
- 出于对称性原因,
Simplex\Container
还提供了一个额外的方法$container->set($id, $value)
是$container[$id] = ...
的别名
- 构造函数接受一个可选的
ContainerInterface $rootContainer = null
参数,以支持 代理查找功能:如果提供,则此容器将被注入到工厂中 - 服务提供者已被完全替换为 container-interop 的服务提供者:这允许在此容器中加载跨框架模块
- 可以使用
$container->extend()
扩展标量值(出于与跨框架服务提供者的兼容性原因)
以下是 Pimple/Simplex 的文档。
安装
composer require mnapoli/simplex
用法
创建容器只需要创建一个 Container
实例
$container = new \Simplex\Container();
定义服务
服务是一个作为更大系统一部分执行某些操作的对象。服务的示例:数据库连接、模板引擎或邮件发送器。几乎任何 全局 对象都可以是服务。
服务是通过返回对象实例的 匿名函数 定义的
// define some services $container['session_storage'] = function ($c) { return new SessionStorage('SESSION_ID'); }; $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 都返回其 同一实例。如果您希望所有调用都返回不同的实例,请使用 factory()
方法将匿名函数包装起来
$container['session'] = $container->factory(function ($c) { return new Session($c['session_storage']); });
现在,每次调用 $container['session']
都返回会话的新实例。
定义参数
定义参数可以简化容器的外部配置,并存储全局值
// define some parameters $container['cookie_name'] = 'SESSION_ID'; $container['session_storage_class'] = 'SessionStorage';
如果您像下面那样更改 session_storage
服务定义
$container['session_storage'] = function ($c) { return new $c['session_storage_class']($c['cookie_name']); };
现在,您可以轻松地通过覆盖 session_storage_class
参数而不是重新定义服务定义来更改cookie名称。
保护参数
由于 Pimple 将匿名函数视为服务定义,因此您需要使用 protect()
方法将匿名函数包装起来以将其存储为参数
$container['random_func'] = $container->protect(function () { return rand(); });
定义后修改服务
在某些情况下,您可能想在定义后修改服务定义。您可以使用 extend()
方法定义在服务创建后立即运行的附加代码
$container['session_storage'] = function ($c) { return new $c['session_storage_class']($c['cookie_name']); }; $container->extend('session_storage', function ($storage, $c) { $storage->...(); return $storage; });
第一个参数是要扩展的服务名称,第二个参数是一个可以访问对象实例和容器的函数。
服务提供者
Simplex 支持注册 跨框架服务提供者。
要注册服务提供者,请将服务提供者数组作为第一个构造函数参数传递。
$container = new \Simplex\Container([new MyServiceProvider()]);