jsoumelidis/zend-sf-di-config

PSR-11 Symfony DI 容器配置器,适用于 ZF 和 Expressive 应用程序

0.5.1 2021-03-30 12:22 UTC

This package is auto-updated.

Last update: 2024-08-29 03:49:48 UTC


README

Build Status Coverage Status

此库提供了一些工具,用于使用 zend-servicemanager 配置来配置一个与 PSR-11 兼容的 Symfony DI 容器

安装

运行以下命令来安装此库

$ composer require jsoumelidis/zend-sf-di-config

配置

要获取一个配置好的 Symfony DI 容器,请按照以下步骤操作

<?php
use JSoumelidis\SymfonyDI\Config\Config;
use JSoumelidis\SymfonyDI\Config\ContainerFactory;

$factory = new ContainerFactory();

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

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

  • services:一个将键映射到特定服务实例的关联数组。
  • invokables:一个将键映射到无参数构造函数的服务;即对于不需要构造函数参数的服务。键和服务名称可能相同;如果不相同,名称被视为别名。
  • factories:一个将服务名称映射到工厂类名称的关联数组,或任何可调用的对象。工厂类必须可以不带参数实例化,并在实例化后可调用(即实现 __invoke() 方法)。
  • aliases:一个将别名映射到服务名称(或另一个别名)的关联数组。
  • delegators:一个将服务名称映射到委托工厂键列表的关联数组,有关更多详细信息,请参阅 Expressive 委托文档

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

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

与 Expressive 一起使用

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

<?php

use JSoumelidis\SymfonyDI\Config\Config;
use JSoumelidis\SymfonyDI\Config\ContainerFactory;

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

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

预先配置 ContainerBuilder

可以将已实例化的 ContainerBuilder 作为 ContainerFactory 的第二个参数传递

<?php

use JSoumelidis\SymfonyDI\Config\Config;
use JSoumelidis\SymfonyDI\Config\ContainerFactory;

$config  = require __DIR__ . '/config.php';

$containerBuilder = new \Symfony\Component\DependencyInjection\ContainerBuilder();

//...Your work here...

$factory = new ContainerFactory();
return $factory(new Config($config), $containerBuilder);

转储/缓存容器

Symfony DI 容器的转储功能现在已支持。有关在 Expressive 中使用的信息,请参阅以下示例。有关编译、转储和缓存 Symfony DIC 配置的更多信息,请访问 symfony 文档 此处

此功能需要 symfony/config 包

<?php
use JSoumelidis\SymfonyDI\Config\Config;
use JSoumelidis\SymfonyDI\Config\ContainerFactory;
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;

$factory = new ContainerFactory();

$config = require __DIR__ . '/config.php';
$cachedContainerFile = 'someFileToDumpContainerConfiguration.php';

$containerConfig = new Config($config, true); //set 2nd argument to true while
                                              //instantiating Config to register
                                              //services as synthetic

if (file_exists($cachedContainerFile)) {
    //load cached container
    require_once($cachedContainerFile);
    
    //boot the cached container
    $container = new ProjectServiceContainer(); //Default class for Symfony DI
    
    //re-set synthetic services, this is mandatory
    $containerConfig->setSyntheticServices($container);
    
    return $container;
}

$container = $factory($containerConfig);

//... other user configuration here

$container->compile();
file_put_contents($cachedContainerFile, (new PhpDumper($container))->dump());

return $container;