原文连接:https://www.wjcms.net/archives/laravel8更新之模型目录及模型工厂类调整
模型目录调整
不久前,泰勒·奥特威尔(Taylor Otwell)在Twitter上进行了一项民意调查,询问社区是否将所有模型都放在一个app/Models文件夹中或使用默认app/目录,并且大多数人表示他们将其模型放入app/Models。
由于该调查,app/Models默认情况下该文件夹现在将包含在Laravel 8中。
如果使用php artisan make:model User命令创建新模型,它将把新模型放在app/Models目录中。
注意:关于这一点的一个值得注意的事情是,如果您不喜欢该Models目录,只要删除该app/Models目录,该artisan命令将app/直接在目录中添加新模型,就像以前在所有Laravel版本中一样。
模型工厂类的调整
Eloquent的模型工厂已完全改写为基于类的工厂,并经过改进以提供一流的关系支持。例如,UserFactory
,在Laravel中包含的内容是这样写的:
<?php
namespace DatabaseFactories;
use AppModelsUser;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
class UserFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = User::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
}
由于HasFactory生成的模型具有新特性,因此可以直接在控制器中使用模型工厂,只需要use一下模型:
use AppModelsUser;
User::factory()->count(50)->create();
由于模型工厂现在是简单的PHP类,因此状态转换可以写为类方法。另外,您可以根据需要将其他任何帮助程序类添加到Eloquent模型工厂中。
例如,您的User模型可能具有suspended修改其默认属性值之一的状态。您可以使用基本工厂的state方法定义状态转换。您可以根据自己的喜好命名状态方法。毕竟,这只是一个典型的PHP方法:
/**
* Indicate that the user is suspended.
*
* @return IlluminateDatabaseEloquentFactoriesFactory
*/
public function suspended()
{
return $this->state([
'account_status' => 'suspended',
]);
}
定义状态转换方法后,我们可以像这样使用它:
use AppModelsUser;
User::factory()->count(5)->suspended()->create();
如前所述,Laravel 8的模型工厂包含对关系的一流支持。因此,假设我们的User模型有一个posts关联方法,我们可以简单地运行以下代码来生成一个包含三个帖子的用户:
$users = User::factory()
->hasPosts(3, [
'published' => false,
])
->create();
为了简化升级过程,已发布了laravel/legacy-factories软件包,以支持Laravel 8.x中模型工厂的先前迭代。
Laravel重新编写的工厂包含许多我们认为您会喜欢的功能。要了解有关模型工厂的更多信息,请查阅数据库测试文档。
关注我,每天更新文章。