fmasa / auto-di
Requires
- php: ^7.1
- nette/di: ^3.0
- nette/robot-loader: ^2.4.2 || ^3.0
Requires (Dev)
- nette/bootstrap: ^3.0
- phpunit/phpcov: ^3.0
- phpunit/phpunit: ^5.7
- satooshi/php-coveralls: ^1.0
This package is auto-updated.
Last update: 2024-09-24 01:51:20 UTC
README
fmasa\autoDI
是一个旨在简化服务注册和配置的包。
扩展的未来
在 Nette 3.0 中,引入了 SearchExtension。它基于与该扩展相同的理念(其中我从 Symfony DependencyInjection 中借鉴了这个理念)。不幸的是,仍然有一些需要解决的问题才能完全取代 fmasa/auto-di
(即 nette/di#215),但另一方面,它是 Nette DI 核心的一部分,并支持一些 fmasa/auto-di
(尚未)不支持的特性。这些是用于注册实现特定接口或扩展特定类的服务的方法。
因此,长期目标是当(如果)SearchExtension 达到功能一致性时,废弃此扩展以支持 SearchExtension。在此之前,我计划继续维护和改进这个包,因为我已经在许多项目中使用了它。
安装
安装 fmasa/auto-di 的最佳方式是使用 Composer
$ composer require fmasa/auto-di
要启用自动注册,请在您的 config.neon
中注册扩展
extensions: autoDI: Fmasa\AutoDI\DI\AutoDIExtension
基于模式的定义
autoDI
通过正则表达式注册服务
autoDI: services: - class: App\Model\**\*Repository
这注册了命名空间下以 Repository
结尾的所有 App\Model
类
- App\Model\Eshop\UserRepository
- App\Model\CMS\Comments\CommentsRepository
在模式中可以使用几个简单的运算符
*
匹配类名、一个命名空间级别或其一部分(不包括 \)**
匹配命名空间或类名的任何部分(包括 \){Eshop,CMS}
选项列表,列表中的任何项都匹配此模式
除了这些之外,还可以使用任何 PCRE 正则表达式。
类和生成的工厂
该包支持类和 生成的工厂。
类与 class
字段匹配,工厂与 implement
字段匹配,这与 Nette 使用这些字段的方式相对应。
当使用 class
字段时,会跳过所有匹配的接口,反之亦然。
autoDI: services: # Repositories - class: App\Model\**\*Repository # Component factories - implement: App\Components\very**\I*Factory
标签、自动注入、...
DI 中支持的所有选项(标签、注入、自动注入、...)都支持与正常服务注册相同的语法
autoDI: services: # Repositories - class: App\Model\Subscribers\** tags: [eventBus.subscriber]
上面的代码片段注册了 App\Model\Subscribers
命名空间中的所有类,带有 eventBus.subscriber
标签。
排除服务
有时我们希望排除某些服务进行注册。为此,我们可以使用接受模式或模式列表的 exclude
字段
autoDI: services: - class: App\Model\** exclude: App\Model\{Entities,DTO}**
这等同于
autoDI: services: - class: App\Model\** exclude: - App\Model\Entities** - App\Model\DTO**
已注册的服务
当扩展发现已经通过 services
部分、不同扩展或之前的 autoDI
定义注册的服务时,它将被跳过。
这允许手动注册需要特定配置的特定服务。
默认部分
要指定通过 autoDI
注册的所有服务的基配置,可以使用 defaults
部分
autoDI: defaults: tags: [ my.auto.service ] services: # these services will have tag my.auto.service - class: App\Model\Repositories\** # these services will have only tag eventBus.subscriber - class: app\Model\Subscribers\** tags: [ eventBus.subscriber ]
配置目录
默认情况下,扩展在 %appDir%
中搜索服务,但可以指定其他目录
autoDI: directories: - %appDir% - %appDir%/../vendor
在配置上注册服务
编译器扩展,如AutoDIExtension,在两个阶段(配置加载和编译前)操作DI容器。默认情况下,此扩展在编译前注册所有服务。如果您想与其他扩展(如装饰器)一起使用此扩展,这可能不是最佳选择。
您可以通过将registerOnConfiguration
选项设置为true来强制在配置阶段进行注册。
如果配置条目没有注册服务,要么是因为没有类/接口匹配模式,要么是因为所有匹配的服务都已注册到容器中,则会抛出异常。您可以通过将errorOnNotMatchedDefinitions
选项设置为false来禁用此检查。