为何Laravel自定义模块生成命令生成合并命名空间而非子模块?
问题原因分析
你执行自定义命令后目录结构不符合预期,核心原因有两个:
- 命令行转义符导致参数丢失分隔符
在类Unix系统(Linux、macOS)的默认shell、以及部分版本的Windows PowerShell中,反斜杠\是转义字符,你执行的命令:php artisan make:module Admin\Users --model --controller
输入的Admin\Users中的反斜杠会被shell自动转义清除,最终传入命令的name参数实际值为AdminUsers,而非你预期的带层级的Admin\Users。拼接命名空间后生成的路径自然就是合并的单级AdminUsers目录,而非Admin/Users分级目录。 - 参数未做统一预处理
你的代码中直接使用$this->argument('name')拼接路径,没有提前对参数中的分隔符做统一处理,即便用户输入时用正斜杠/代替反斜杠,也会导致命名空间拼接错误。
修复方案
- 执行命令时用引号包裹带层级的参数,避免shell转义:
php artisan make:module "Admin\Users" --model --controller - 在自定义命令中增加参数预处理逻辑,统一分隔符格式,调整后的
createModel代码如下:
private function createModel() { // 统一处理参数中的正斜杠、反斜杠为标准命名空间分隔符 $moduleName = str_replace(['/', '\\'], '\\', trim($this->argument('name'))); $model = Str::singular(Str::studly(class_basename($moduleName))); $this->call('make:model', [ 'name' => "App\\Modules\\".$moduleName."\\Models\\".$model ]); }
其余生成控制器、迁移的逻辑也需要同步使用预处理后的$moduleName变量拼接路径,即可生成预期的分级目录结构。
效果对比
- 实际运行结果(修复前):

- 预期结果(修复后):

内容的提问来源于stack exchange,提问作者Егор Трегубенко
相关产品推荐
相关产品推荐

