zendframework/zend-pimple-config

此包已被废弃,不再维护。作者建议使用laminas/laminas-pimple-config包。

PSR-11 Pimple容器配置器,适用于ZF和Expressive应用

1.1.1 2019-05-01 21:42 UTC

This package is auto-updated.

Last update: 2020-01-20 20:11:31 UTC


README

仓库于2019-12-31废弃

此仓库已迁移至laminas/laminas-pimple-config

Build Status Coverage Status

此库提供工具,用于使用zend-servicemanager配置来配置一个兼容PSR-11Pimple容器,以便在Expressive中使用。

安装

运行以下命令以安装此库

$ composer require zendframework/zend-pimple-config

配置

要获取配置好的PSR-11 Pimple容器,请按照以下步骤操作

<?php
use Zend\Pimple\Config\Config;
use Zend\Pimple\Config\ContainerFactory;

$factory = new ContainerFactory();

$container = $factory(
    new Config([
        'dependencies' => [
            'services'          => [],
            'invokables'        => [],
            'factories'         => [],
            'aliases'           => [],
            'delegators'        => [],
            'extensions'        => [],
            'shared'            => [],
            'shared_by_default' => true,
        ],
        // ... other configuration
    ])
);

dependencies子关联数组可以包含以下键

  • services:一个关联数组,将键映射到特定的服务实例。
  • invokables:一个关联数组,将键映射到无参构造函数的服务;即,对于不需要构造函数参数的服务。键和服务名称通常相同;如果不相同,则键被视为别名。
  • factories:一个关联数组,将服务名称映射到工厂类名称,或任何可调用对象。工厂类必须可以无参实例化,并在实例化后可调用(即实现__invoke()方法)。
  • aliases:一个关联数组,将别名映射到服务名称(或另一个别名)。
  • delegators:一个关联数组,将服务名称映射到委托工厂键的列表,有关更多详细信息,请参阅Expressive委托者文档
  • extensions:一个关联数组,将服务名称映射到扩展工厂名称的列表,有关更多详细信息,请参阅下面的章节
  • shared:一个关联数组,将服务名称映射到布尔值,以便告诉服务管理器是否应该缓存通过get方法创建的服务,独立于shared_by_default设置。
  • shared_by_default:一个布尔值,表示通过get方法创建的服务是否应该被缓存。默认值为true

请注意,整个配置都在config键的$container中可用

$config = $container->get('config');

extensions

仅当使用Pimple容器时,才可使用extensions配置。如果您正在使用Aura.Dizend-servicemanager,则可以使用delegators代替。如果您想保持最高的兼容性,并可能考虑将来更改您使用的容器库,则建议使用delegators

扩展工厂具有以下签名

use Psr\Container\ContainerInterface;

public function __invoke(
    $service,
    ContainerInterface $container,
    $name
);

传递给扩展工厂的参数如下

  • $service 是实际的服务实例。
  • $container 是用于为请求的服务创建扩展时使用的容器。
  • $name 是请求的服务的名称。

以下是一个示例扩展工厂

use Psr\Container\ContainerInterface;

class ExtensionFactory
{
    public function __invoke($service, ContainerInterface $container, $name)
    {
        // do something with $service

        return $service;
    }
}

您也可以从扩展工厂返回不同的实例

use Psr\Container\ContainerInterface;

class ExtensionFactory
{
    public function __invoke($service, ContainerInterface $container, $name)
    {
        return new Decorator($service);
    }
}

请注意,在配置扩展时,您必须提供服务的一个 列表 作为扩展工厂,而不是单个扩展工厂名称

new Config([
    'dependencies' => [
        'invokables' => [
            'my-service' => MyInvokable\Service::class,
        ],
        'extensions' => [
            'my-service' => [
                Extension1Factory::class,
                Extension2Factory::class,
                // ...
            ],
        ],
    ],
]);

服务扩展的调用顺序与列表中定义的顺序相同。

与Expressive一起使用

config/container.php 的内容替换为以下内容

<?php

use Zend\Pimple\Config\Config;
use Zend\Pimple\Config\ContainerFactory;

$config  = require __DIR__ . '/config.php';
$factory = new ContainerFactory();

return $factory(new Config($config));