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

Laravel自定义make:service命令:修复子目录命名空间错误

解决自定义Artisan Service命令的命名空间问题

问题出在Stub文件的命名空间是硬编码固定值,且命令类未处理动态命名空间的替换逻辑。以下是修复步骤:

1. 修改Stub文件

将Stub里的固定命名空间替换为占位符,让其能动态填充正确的命名空间:

<?php

namespace {{ namespace }};

class {{ service_name }}
{
    public function __construct()
    {
        
    }
}

2. 更新MakeService命令类

在replaceClass方法中添加命名空间的替换逻辑,利用Laravel内置方法获取正确的命名空间:

<?php

namespace App\Console\Commands;

use Illuminate\Console\GeneratorCommand;

class MakeService extends GeneratorCommand
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'make:service {name}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Create a Service class';

    public function getStub()
    {
        return app_path() . '/Console/Commands/Stubs/make-service.stub';
    }

    public function getDefaultNamespace($rootNamespace)
    {
        return $rootNamespace . '\\Services';
    }

    protected function replaceClass($stub, $name)
    {
        $namespace = $this->getNamespace($name);
        $class = str_replace($namespace . '\\', '', $name);

        $stub = str_replace('{{ namespace }}', $namespace, $stub);
        $stub = str_replace('{{ service_name }}', $class, $stub);

        return $stub;
    }
}

原理说明

  • $this->getNamespace($name)会自动根据输入的类名(如Test/TestService)和getDefaultNamespace设置的基础命名空间,拼接出完整的命名空间App\Services\Test。
  • 替换Stub中的占位符后,生成的文件就会拥有与目录结构匹配的正确命名空间。

测试验证:执行php artisan make:service Test/TestService,生成的Services/Test/TestService.php文件中,命名空间将是App\Services\Test,符合预期。

内容的提问来源于stack exchange,提问作者Gabriel Fucci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:45:13