前言
使用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 文件,并继承源类
<?phpnamespace AppCustomizeFoundationConsole;class ModelMakeCommand extends IlluminateFoundationConsoleModelMakeCommand{ protected function getStub() { if ($this->option('pivot')) { return parent::getStub(); } return __DIR__ . '/stubs/model.stub'; }}复制代码
在当前文件目录下创建 stubs/model.stub 文件
<?phpnamespace DummyNamespace;use AppCustomizeDatabaseEloquentModel; // 自定义的Model基类class DummyClass extends Model{ //}复制代码
重新绑定模型创建命令服务
两种方式:
- 直接在 AppServiceProvider.php 中重新绑定新的ModelMakeCommand服务
- 创建一个新的服务提供者,并将其追加到配置文件 config/app.php 的 providers 数组中
测试
使用 php artisan make:model Test 创建一个Model,确认过眼神,是继承于自定义Model基类的Model
作者:jassue
链接:https://juejin.im/post/6885152866261008397