使用 Symfony autowire 时是否可以排除多个目录?

问题描述 投票:0回答:3

在 Symfony 4 中使用 autowire 时,我使用了这个工作代码:

App\:
    resource: '../src/*'
    exclude: '../src/{Domain,Entity,Migrations,Tests}'

该代码从自动装配中排除所有这些文件夹:

- src/Domain
- src/Entity
- src/Migrations
- src/Tests

没关系,但是当我想排除分散在另一个文件夹中的多个同名文件夹时,问题就来了。

例如,如果我们有这样的结构:

  • src/文件夹1/要排除的文件夹
  • src/文件夹2/文件夹2-1/要排除的文件夹

¿有没有办法排除所有名为FolderToExclude的文件夹?

我已经尝试过以下代码,但有一些小的变化:

App\:
    resource: '../src/*'
    exclude: '../src/{Domain,Entity,Migrations,Tests,**/FolderToExclude}'

但是不起作用:(

php symfony autowired symfony4
3个回答
5
投票

在 Symfony 4.1 中。但有 有一个已关闭的错误 拉取请求 可能会使此功能可用于 symfony 4.2 !


0
投票

排除某些目录为服务容器初始化和服务自动加载处理带来一些效率提升...

但是,通过“排除”服务配置选项也可以实现其他一些重要功能:

  • 恕我直言,“排除”选项的一个非常好的动机是,还允许管理 PSR-4 自动加载与内部捆绑包(在 src/ 目录下)的冲突。
  • 排除子目录块是保护 SF4 应用程序中内部包命名空间的安全方法。这还可以防止内部捆绑包和 SF4 的应用程序捆绑包之间的自动加载冲突。

  • 在您的情况下,最好手动指定每个FolderToExclude的路径,检查与App子文件夹没有跨界。

  • 如果要排除的子目录数量太大,您无法单独枚举它们,那么您首先肯定会遇到代码设计/组织问题需要解决。

希望这对您的设计决策有所帮助。


0
投票

自 SF3 起:“资源和排除选项的值可以是任何有效的全局模式。”

自 SF4 起,增加了一项内容:“排除选项的值也可以是全局模式的数组。”

这仍然是当前的(当前是 SF7):https://symfony.com/doc/current/service_container.html#service-container-services-load-example

Glob 模式(wiki)完全可以满足您的要求, 例如

# config/services.yaml
services:
    App\:
        resource: '../src/*'
        exclude:
            - '../src/Something/Deep/**/Dto'

您遇到的问题似乎是重叠

{}
和 glob 模式,我不确定这是允许的。 因此,这应该有效:

TL;DR - 单独:

App\:
    resource: '../src/*'
    exclude:
        - '../src/{Domain,Entity,Migrations,Tests}'
        - '../src/**/FolderToExclude'

© www.soinside.com 2019 - 2024. All rights reserved.