Laravel 自定义 Artisan 创建 Service 命令完整指南
需求背景
在 Laravel 接口开发项目中,通常会采用「Controller + Service」的分层架构模式。通过 php artisan 命令可以查看,Laravel 框架默认提供了创建控制器(Controller)的相关命令,但未内置创建 Service 类的快捷命令。为提升开发效率,本文将详细介绍如何自定义 Artisan 命令,实现 Service 类的快速生成。
注:Laravel 执行 php artisan 命令时,会自动加载所有继承于 Command 类的子类,这是自定义命令的核心原理。
自定义命令步骤
1. 创建基础命令文件
首先执行以下 Artisan 命令,生成自定义命令的基础文件:
php artisan make:command MakeServiceCommand
执行成功后,会在项目目录 app\Console\Commands 下生成 MakeServiceCommand.php 文件,初始代码如下:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MakeServiceCommand extends Command
{
/**
* 命令名称与签名
*
* @var string
*/
protected $signature = 'command:name';
/**
* 命令描述
*
* @var string
*/
protected $description = 'Command description';
/**
* 创建命令实例
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* 执行命令
*
* @return mixed
*/
public function handle()
{
//
}
}
2. 改造命令类
我们将模仿 Laravel 内置的 EventMakeCommand 类(该类实现简洁,适合作为参照)来改造自定义命令,被模仿文件路径为:
vendor\laravel\framework\src\Illuminate\Foundation\Console\EventMakeCommand.php
核心改造点
-
修改继承类:将
MakeServiceCommand类的父类从Command改为GeneratorCommand(GeneratorCommand已继承Command类,提供了生成类文件的核心能力)。 -
配置命令签名:修改
$signature为make:service {name},其中{name}为必填参数,用于指定 Service 类名。 -
完善命令描述:修改
$description为「创建 Service 类」,明确命令功能。 -
指定类类型:添加
$type = 'Service',标识当前命令生成的类类型。 -
配置模板路径:通过
getStub()方法指定 Service 类的模板文件路径。 -
设置默认命名空间:通过
getDefaultNamespace()方法指定 Service 类的默认存放目录。
改造后的完整代码
<?php
namespace App\Console\Commands;
use Illuminate\Console\GeneratorCommand;
class MakeServiceCommand extends GeneratorCommand
{
/**
* 命令名称与签名
*
* @var string
*/
protected $signature = 'make:service {name}';
/**
* 命令描述
*
* @var string
*/
protected $description = '创建 Service 类';
/**
* 生成的类类型
*
* @var string
*/
protected $type = 'Service';
/**
* 指定模板文件位置
*
* @return string
*/
protected function getStub()
{
return __DIR__.'/stubs/service.stub';
}
/**
* 获取类的默认命名空间
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Http\Service';
}
}
3. 创建 Service 模板文件
(1)在 app\Console\Commands 目录下创建 stubs 文件夹(用于存放命令模板)。
(2)在 stubs 文件夹中创建 service.stub 文件,作为 Service 类的生成模板,模板代码如下:
<?php
namespace DummyNamespace;
class DummyClass
{
public function index()
{
// 自定义业务逻辑
}
}
注:模板中的 DummyNamespace 和 DummyClass 是占位符,执行命令时会自动替换为实际的命名空间和类名。
命令测试与效果验证
完成上述配置后,即可通过自定义命令生成 Service 类,支持两种常见场景:
1. 生成基础 Service 类
执行命令:
php artisan make:service OrderService
生成结果:在 app\Http\Service 目录下创建 OrderService.php 文件,内容如下:
<?php
namespace App\Http\Service;
class OrderService
{
public function index()
{
// 自定义业务逻辑
}
}
2. 生成带目录结构的 Service 类
若需要在 Service 目录下创建子目录并生成类,可执行命令:
php artisan make:service backend/AdminService
生成结果:自动创建 app\Http\Service\backend 目录,并在该目录下生成 AdminService.php 文件,内容如下:
<?php
namespace App\Http\Service\backend;
class AdminService
{
public function index()
{
// 自定义业务逻辑
}
}
总结
通过以上步骤,我们成功实现了 Laravel Artisan 自定义创建 Service 命令的功能。该命令支持基础类生成和带目录结构的类生成,完全贴合实际开发需求,可大幅提升分层架构开发的效率。核心要点如下:
-
基于
GeneratorCommand类扩展自定义命令,复用框架的类生成能力。 -
通过模板文件
service.stub统一 Service 类的基础结构。 -
支持动态指定类名和目录,适配不同业务场景。


