thecodinghood / zendphpdiconfig
临时分支自 elie29/zend-di-config
v1.0.0
2022-07-25 11:30 UTC
Requires
- php: >=7.4
- laminas/laminas-stdlib: ^3.2
- php-di/php-di: ^6.3
Requires (Dev)
- laminas/laminas-coding-standard: ^2.1.4
- mikey179/vfsstream: ^1.6.7
- mockery/mockery: ^1.0
- phpspec/prophecy-phpunit: ^2.0
- phpstan/phpstan: ^0.12.57
- phpstan/phpstan-mockery: ^0.12.13
- phpunit/phpunit: ^9.0
This package is auto-updated.
Last update: 2024-09-28 23:51:37 UTC
README
简介
zend-phpdi-config 充当配置 PSR-11 兼容 PHP-DI 容器的桥梁,使用服务管理器配置。从 v6.0.0 版本开始,它可以与 Laminas 和 Mezzio 一起使用。
此库使用自动连接技术、缓存编译和缓存定义,这些在 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 命令以添加新的自动连接条目
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) { } }
切换回另一个容器
切换回另一个容器非常简单
- 使用
__invoke函数创建您的工厂 - 将 ConfigProvider 中的
autowires键替换为factories键,然后为每个类名附加相应的工厂。
PSR 11 和 Interop\Container\ContainerInterface
V4.x 也支持 Interop\Container\ContainerInterface
迁移指南
- 从 3.x 迁移到 4.0
- 从 4.x 迁移到 5.0:删除了 container-interop/container-interop,以支持 PSR-11。