前言
使用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
{
//
}
重新绑定模型创建命令服务
两种方式:
- 直接在
AppServiceProvider.php
中重新绑定新的ModelMakeCommand服务 - 创建一个新的服务提供者,并将其追加到配置文件
config/app.php
的providers
数组中
测试
使用 php artisan make:model Test
创建一个Model,确认过眼神,是继承于自定义Model基类的Model