fmasa/auto-di

2.0.0 2020-02-23 15:58 UTC

This package is auto-updated.

Last update: 2024-09-24 01:51:20 UTC


README

Build Status Coverage Status

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来禁用此检查。