symfony 7.1 中 finder 组件的 exclude() 方法可高效跳过指定子目录(如 'vendor' 或 'node_modules'),不递归遍历其内容;支持字符串、数组及 glob 通配符(如 'cache-*'),路径须为相对路径,且不同于低效的 notpath()。

在 Symfony 7.1 中,Finder 组件支持通过 exclude() 方法精准排除指定子目录,且该方法对嵌套层级完全有效——它会跳过整个匹配目录及其全部内容,不进入遍历,性能更优。
直接排除一个或多个子目录
使用 exclude() 传入字符串或字符串数组,路径为相对于 in() 指定根目录的相对路径(不以 / 开头):
-
exclude('node_modules')排除根目录下的node_modules文件夹 -
exclude(['vendor', 'tests', '.git'])同时排除多个目录 - 若
in(__DIR__),而你想排除src/Helper,应写exclude('src/Helper'),不是'/src/Helper'或绝对路径
注意 exclude 与 notPath 的区别
exclude() 是“跳过目录”,不扫描其内部,适合排除大型无关目录(如 vendor、node_modules);
notPath() 是“过滤已遍历到的路径”,仍会递归进入被排除的目录再比对,效率低、不推荐用于目录跳过。
- ✅ 正确(高效):
$finder->in(__DIR__)->exclude('vendor')->files()->name('*.php') - ❌ 不推荐(低效):
$finder->in(__DIR__)->notPath('/vendor/')->files()->name('*.php')
排除带通配符或模式的子目录
Symfony 7.1 支持 glob 风格通配符(需确保未禁用):
-
exclude('cache-*')排除所有以cache-开头的子目录 -
exclude(['log_*', 'tmp'])多个模式组合 - 注意:通配符仅匹配目录名本身,不作用于路径中间段(如
exclude('*/temp')无效)
结合 ignoreVcs() 自动跳过版本控制目录
如果还需忽略 .git、.svn 等,可链式调用:
$finder->in(__DIR__)->exclude('vendor')->ignoreVcs(true)->files()-
ignoreVcs(true)默认启用(Symfony 6+ 行为),显式写出更清晰











