自定义Laravel命令行make指令生成的文件

1,398 阅读1分钟

前言

使用Laravel或其他框架开发的时候,通常会创建一个Model基类,让所有的Model继承这个基类,但是使用 Laravel Artisan 控制台指令创建的Model并不是继承于我所创建的基类,为了避免每次都要手工修改,需要重写源码的生成方法

阅读源码并分析

服务提供者是 Laravel 应用启动的中心,所有服务提供者都是通过配置文件 config/app.php 中进行注册,那么我们就直奔 config/app.php 文件找到控制台的服务提供者

打开 ConsoleSupportServiceProvider.php 后,发现有三个服务提供者,目标文件是Artisan 控制台服务提供者,无视其他两个文件


阅读 ArtisanServiceProvider.php 代码后,找到了注册创建Model命令的方法  registerModelMakeCommand 


最后打开 ModelMakeCommand.php 文件,找到了Model生成器文件 stubs/model.stub


分析:只需要修改 stubs/model.stub 文件即可,但不提倡直接修改源码,这里选择创建新的ModelMakeCommand服务,重写 getStub 方法,重新绑定到服务容器

自定义模型创建命令服务

在项目根目录下创建 Customize 目录,用于存放自定义框架类,这里我根据源 ModelMakeCommand.php 文件的存放路径, 创建 Customize/Foundation/Console/ModelMakeCommand.php 文件,并继承源类

<?php

namespace App\Customize\Foundation\Console;

class ModelMakeCommand extends \Illuminate\Foundation\Console\ModelMakeCommand
{
    protected function getStub()
    {
        if ($this->option('pivot')) {
            return parent::getStub();
        }
        return __DIR__ . '/stubs/model.stub';
    }
}

在当前文件目录下创建 stubs/model.stub 文件

<?php

namespace DummyNamespace;

use App\Customize\Database\Eloquent\Model; // 自定义的Model基类

class DummyClass extends Model
{
    //
}

重新绑定模型创建命令服务

两种方式:

  1. 直接在 AppServiceProvider.php 中重新绑定新的ModelMakeCommand服务
  2. 创建一个新的服务提供者,并将其追加到配置文件 config/app.php providers 数组中

测试

使用 php artisan make:model Test 创建一个Model,确认过眼神,是继承于自定义Model基类的Model