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
相关产品推荐
相关产品推荐

