thecodinghood/zendphpdiconfig

临时分支自 elie29/zend-di-config

v1.0.0 2022-07-25 11:30 UTC

This package is auto-updated.

Last update: 2024-09-28 23:51:37 UTC


README

Build Status Coverage Status

简介

zend-phpdi-config 充当配置 PSR-11 兼容 PHP-DI 容器的桥梁,使用服务管理器配置。从 v6.0.0 版本开始,它可以与 LaminasMezzio 一起使用。

此库使用自动连接技术、缓存编译和缓存定义,这些在 PHP-DI 中定义。

配置

服务管理器配置

要获取一个配置好的 PSR-11 PHP-DI 容器,执行以下操作

<?php

use Elie\PHPDI\Config\Config;
use Elie\PHPDI\Config\ContainerFactory;

$factory = new ContainerFactory();

$container = $factory(
    new Config([
        'dependencies' => [
            'services'   => [],
            'invokables' => [],
            'autowires'  => [], // A new key added to support PHP-DI autowire technique
            'factories'  => [],
            'aliases'    => [],
            'delegators' => [],
        ],
        // ... other configuration

        // Enable compilation
        Config::DI_CACHE_PATH => __DIR__, // Folder path

        // Write proxies to file : cf. https://php-di.org/doc/lazy-injection.html
        Config::DI_PROXY_PATH => __DIR__, // Folder path

        // Disable autowire (enabled by default)
        Config::USE_AUTOWIRE => false

        // Enable cache
        Config::ENABLE_CACHE_DEFINITION => false, // boolean, true if APCu is activated
    ])
);

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

  • services:一个关联数组,将一个键映射到一个特定的服务实例或服务名称。
  • invokables:一个关联数组,将一个键映射到一个无构造函数的服务;即对于不需要构造函数参数的服务。键和服务名称通常相同;如果它们不相同,则键被视为别名。它也可以是服务数组。
  • autowires:一个服务数组(带或不带构造函数);PHP-DI 提供了一种自动连接技术,该技术将扫描代码以查看构造函数中需要什么参数。所需的任何别名都应该在别名配置中创建。
  • factories:一个关联数组,将服务名称映射到工厂类名称,或任何可调用对象。工厂类必须无参数可实例化,并在实例化后可调用(即实现 __invoke() 方法)。
  • aliases:一个关联数组,将别名映射到服务名称(或另一个别名)。
  • delegators:一个关联数组,将服务名称映射到委托工厂键列表,有关详细信息,请参阅 Expressive 委托者文档

注意:整个配置(除非 dependencies)合并到 $container 中的 config 键内

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

CLI 命令以添加新的自动连接条目

Configuration image

CLI 命令 add-autowires-entry 在不存在的情况下创建配置文件,否则将条目添加到自动连接键。

向 config.php 添加 ConsoleHelper 的示例

./vendor/bin/add-autowires-entry config.php "Laminas\\Stdlib\\ConsoleHelper"
[DONE] Changes written to config.php

与 Expressive 一起使用

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

<?php

declare(strict_types = 1);

use Elie\PHPDI\Config\Config;
use Elie\PHPDI\Config\ContainerFactory;

// Protect variables from global scope
return call_user_func(function () {

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

    $factory = new ContainerFactory();

    // Container
    return $factory(new Config($config));
});

配置提供者类的示例

<?php

class ConfigProvider
{

    /**
     * Returns the configuration array
     */
    public function __invoke(): array
    {
        return [
            'dependencies' => $this->getDependencies()
        ];
    }

    /**
     * Returns the container dependencies
     */
    public function getDependencies(): array
    {
        return [
            'autowires' => [
                UserManager::class
            ]
        ];
    }
}

其中 UserManager 依赖于 Mailer,如下所示

class UserManager
{
    private $mailer;

    public function __construct(Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function register($email, $password)
    {
        $this->mailer->mail($email, 'Hello and welcome!');
    }
}

class Mailer
{
    public function mail($recipient, $content)
    {
    }
}

切换回另一个容器

切换回另一个容器非常简单

  1. 使用 __invoke 函数创建您的工厂
  2. 将 ConfigProvider 中的 autowires 键替换为 factories 键,然后为每个类名附加相应的工厂。

PSR 11 和 Interop\Container\ContainerInterface

V4.x 也支持 Interop\Container\ContainerInterface

迁移指南