mnapoli/simplex

支持完整容器互操作的Pimple分支

0.5.0 2018-02-13 08:14 UTC

This package is auto-updated.

Last update: 2024-09-19 20:38:42 UTC


README

Build Status

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()]);