Laravel中如何在自定义目录生成含关联类的模型?
解决Laravel中
make:model --all生成组件到自定义子目录的问题 方案一:手动指定各组件的路径参数
Laravel的make:model命令的--all(或-a)参数默认只会将模型放到指定子目录,其他组件(控制器、迁移、工厂、种子)需要单独通过参数指定目标路径:
执行以下命令可一次性将所有组件生成到对应子目录:
php artisan make:model locations/City --controller=locations/CitiesController --factory=locations/CityFactory --seed=locations/CitySeeder --migration --path=database/migrations/locations
各参数说明:
--controller=locations/CitiesController:指定控制器生成在app/Http/Controllers/locations目录下--factory=locations/CityFactory:指定工厂类生成在database/factories/locations目录下--seed=locations/CitySeeder:指定种子类生成在database/seeders/locations目录下--migration --path=database/migrations/locations:指定迁移文件生成在database/migrations/locations子目录
注意:迁移的子目录需要提前手动创建,否则命令会报错;其他组件的子目录会自动创建。
方案二:自定义Artisan生成命令(进阶)
如果需要频繁生成这类子目录下的组件,可以自定义一个Artisan命令,封装上述参数逻辑:
- 生成自定义命令:
php artisan make:command MakeModelWithSubdir
- 在生成的
app/Console/Commands/MakeModelWithSubdir.php文件中,编写逻辑接收模型子路径和名称,自动拼接各组件的路径参数并执行原生命令。示例核心代码:
public function handle() { $modelPath = $this->argument('model-path'); // 拆分路径和模型名 [$subdir, $modelName] = explode('/', $modelPath); $pluralModelName = Str::plural($modelName); // 执行模型生成命令,附带所有组件的路径参数 $this->call('make:model', [ 'name' => $modelPath, '--controller' => "$subdir/{$pluralModelName}Controller", '--factory' => "$subdir/{$modelName}Factory", '--seed' => "$subdir/{$modelName}Seeder", '--migration' => true, '--path' => "database/migrations/{$subdir}" ]); }
- 在命令类的
$signature属性中定义参数:
protected $signature = 'make:model-subdir {model-path : 模型的子目录和名称,如locations/City}';
- 之后只需执行自定义命令即可一键生成所有子目录下的组件:
php artisan make:model-subdir locations/City
补充说明
Laravel原生的--all参数设计逻辑是:仅对模型应用指定的子路径,其他组件保持各自默认的根目录结构,因此无法直接通过--all实现所有组件同步到子目录的需求,必须通过上述两种方式处理。
内容的提问来源于stack exchange,提问作者Ahmed El Prince
相关产品推荐
相关产品推荐

