Contributed by
Nicolas Grekas Ryan Weaver
in #21289 and #22680.

Symfony 3.3将会引入大量“简化你在程序中使用服务”的功能,诸如 简化配置autoconfig自动配置 等。本文解释后一个同Dependency Injection相关的重大功能: PSR-4 based service discovery and registration(基于PSR-4的服务的发掘以及注册)。

理念是,在给定目录中查找PHP类,并把它们注册为服务,如果它们的命名空间符合PSR-4的命名语法(naming syntax)的话。此功能使用 resource 选项进行配置,该选项接受一个目录路径,或一个Glob expression以匹配多个目录。例:

1
2
3
4
5
6
7
8
9
10
11
12
services:
    # ...
 
    # this creates a service per class whose id is the fully-qualified class name
    # 这会为每个类创建一个服务,服务id是FQCN(完整类名)
    App\:
        resource: '../../src/{Command,Form,EventSubscriber,Twig,Security}'

    App\Controller\:
        resource: '../../src/Controller'
        public: true
        tags: ['controller.service_arguments']

如果你的程序包含许多目录,你可以使用 resource 选项中的 * 值来全部包容之,然后再根据需要使用 exclude 选项来排除一些目录:

1
2
3
4
5
6
7
8
9
10
services:
    # ...

    AppBundle\:
        # discover services in all AppBundle/ sub-directories...
        # 在 AppBundle/ 的全部子目录中发现服务
        resource: '../../src/AppBundle/*'
        # ... except in those matching this Glob expression
        # ... 不包括那些匹配了下面这个Glob表达式的类
        exclude: '../../src/AppBundle/{AppBundle.php,Entity}'