Laravel执行make:model -mcs时相关文件的生成逻辑与来源
命令执行生成流程
执行php artisan make:model 'FileName' -mcs时,文件生成按固定逻辑推进:
- 首先做参数校验解析:校验传入的
FileName是否符合PHP类名规范,同时解析短选项标记:-m等价于--migration,标记需生成对应数据库迁移文件-c等价于--controller,标记需生成对应模型的控制器-s等价于--seeder,标记需生成对应模型的数据填充文件
make:model命令本身默认就会生成模型文件,不需要额外加参数标记。
- 优先生成核心模型文件:在
app/Models/目录下创建FileName.php,默认写入继承Eloquent基类的基础模型结构,自动根据模型名推导对应的数据表名。 - 按选项标记依次生成关联文件:
- 处理
-m参数:在database/migrations/目录下生成带时间戳前缀的迁移文件,命名格式为[YYYY_MM_DD_HHMMSS]_create_[模型对应表名复数]_table.php,文件内预置自增ID、时间戳字段的基础表创建骨架。 - 处理
-c参数:在app/Http/Controllers/目录下生成FileNameController.php,未额外加--resource参数时生成空控制器,加了该参数会预置资源路由对应的7个标准方法空骨架。 - 处理
-s参数:在database/seeders/目录下生成FileNameSeeder.php,写入继承Seeder基类的基础填充类结构。
- 处理
- 所有文件生成前会先校验目标路径是否存在同名文件,存在则直接抛出错误终止执行,不会覆盖原有文件;只有追加
--force参数时才会强制覆盖已有文件。所有操作完成后,命令行会逐行输出每个文件的生成路径与成功状态。 - 如果需要生成模型工厂,要追加
-f/--factory参数,本次执行的-mcs参数组合不会生成工厂文件。
生成依赖的源模板存放位置
Laravel的make系列命令生成文件依赖的模板叫stub存根文件,存放位置分两种场景:
- 默认未自定义模板的场景:所有官方预置的模板存放在框架核心源码的
vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/目录下,本次命令涉及的对应模板分别为:- 普通模型模板:
model.stub - 建表迁移模板:
migration.create.stub - 普通空控制器模板:
controller.plain.stub,API场景空控制器用controller.api.stub,带资源方法的控制器用controller.model.stub - 数据填充模板:
seeder.stub
生成文件时,框架会自动替换stub文件内的{{ class }}、{{ namespace }}、{{ table }}这类占位符,替换为实际的类名、命名空间、表名等动态内容后,再写入项目对应目录。
- 普通模型模板:
- 自定义模板的场景:如果项目中执行过
php artisan stub:publish命令,所有stub文件会被发布到项目根目录的stubs/目录下,后续执行make系列命令时,会优先读取该目录下的自定义模板,不再读取vendor目录下的官方默认模板,你可以直接修改这个目录下的stub文件,定制符合项目规范的生成文件结构。
内容的提问来源于stack exchange,提问作者Shourov Shahadat
相关产品推荐
相关产品推荐

