You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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')拼接路径,没有提前对参数中的分隔符做统一处理,即便用户输入时用正斜杠/代替反斜杠,也会导致命名空间拼接错误。
修复方案
  1. 执行命令时用引号包裹带层级的参数,避免shell转义:
    php artisan make:module "Admin\Users" --model --controller
  2. 在自定义命令中增加参数预处理逻辑,统一分隔符格式,调整后的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,提问作者Егор Трегубенко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:57:01