Laravel – Artisan定制自己的创建service命令

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 改为 GeneratorCommandGeneratorCommand 已继承 Command 类,提供了生成类文件的核心能力)。

  • 配置命令签名:修改 $signaturemake: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()
    {
        // 自定义业务逻辑
    }
}

注:模板中的 DummyNamespaceDummyClass 是占位符,执行命令时会自动替换为实际的命名空间和类名。

命令测试与效果验证

完成上述配置后,即可通过自定义命令生成 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 命令的功能。该命令支持基础类生成和带目录结构的类生成,完全贴合实际开发需求,可大幅提升分层架构开发的效率。核心要点如下:

  1. 基于 GeneratorCommand 类扩展自定义命令,复用框架的类生成能力。

  2. 通过模板文件 service.stub 统一 Service 类的基础结构。

  3. 支持动态指定类名和目录,适配不同业务场景。