⭐️ 🔧 Automatic registration and configuration of services for Nette DI
Switch branches/tags
Clone or download
fmasa Merge pull request #7 from fmasa/php71
Add PHP 7.1 typehints
Latest commit df445de Dec 25, 2017
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src/AutoDI Use strict_types Dec 24, 2017
tests Use strict_types Dec 24, 2017
.gitattributes Remove tests from tarball Sep 23, 2017
.gitignore Initial commit Sep 23, 2017
.travis.yml Drop support for PHP 7.0 and lower Dec 24, 2017
LICENSE Initial commit Sep 23, 2017
README.md Fix typos Dec 24, 2017
composer.json Drop support for PHP 7.0 and lower Dec 24, 2017
phpunit.xml Initial commit Sep 23, 2017

README.md

Auto registration and configuration of services for Nette DI

Build Status Coverage Status

fmasa\autoDI is package intended to make registration and configuration of services easier.

Installation

The best way to install fmasa/auto-di is using Composer:

$ composer require fmasa/auto-di

To enable auto registration register extension in your config.neon:

extensions:
    autoDI: Fmasa\AutoDI\DI\AutoDIExtension

Pattern based definition

autoDI registers services defined by regex:

autoDI:
    services:
        - class: App\Model\**\*Repository

This registers every class under namespace App\Model which name ends with Repository:

  • App\Model\Eshop\UserRepository
  • App\Model\CMS\Comments\CommentsRepository

There are several simple operators that can be used in patterns:

  • * matches class name, one namespace level or part of it (without \)
  • ** matches any part of namespace or classname (including \)
  • {Eshop,CMS} options list, any item of list matches this pattern

Apart from these, any PCRE regular expression can be used.

Classes and generated factories

Package supports both classes and generated factories.

Classes are matched agains class field, factories againts implement field, which corresponds to way Nette use these fields.

When using class field, all matching interfaces are skipped and vice versa.

autoDI:
    services:
        # Repositories
        - class: App\Model\**\*Repository 
        
        # Component factories
        - implement: App\Components\very**\I*Factory

Tags, autowiring, ...

Every option supported in DI (tags, inject, autowiring, ...) is supported with same syntax as normal service registration

autoDI:
    services:
        # Repositories
        - class: App\Model\Subscribers\**
          tags: [eventBus.subscriber]

The snippet above registers all classes in App\Model\Subscribers namespace with eventBus.subscriber tag.

Exclude services

Sometimes we wan't to exlude certain services from registration. For that we can use exclude field, that accepts pattern or list of patterns:

autoDI:
    services:
        - class: App\Model\**
          exclude: App\Model\{Entities,DTO}**

which is same as

autoDI:
    services:
        - class: App\Model\**
          exclude:
              - App\Model\Entities**
              - App\Model\DTO**

Already registered services

When extension founds service, that is already registered (by services section, different extension or previous autoDI definition), it's skipped.

This allows manual registration of specific services that need specific configuration.

Defaults section

To specify base configuration for all services registered via autoDI, defaults section can be used:

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 ]

Configuring directories

By default extension searches for services in %appDir%, but other directories can be specified:

autoDI:
    directories:
        - %appDir%
        - %appDir%/../vendor

Register services on configuration

Compiler extensions such as AutoDIExtension manipulates the DI container in two phases (configuration loading and before compilation). By default this extension registers all services before compilation. This may not be optimal if you wan't to use this extension with other extensions such as decorator.

You can enforce registration in configuration phase by setting registerOnConfiguration option to true.