Laravel 模型工厂和模型观察者

在 Laravel 中,php artisan make:factory namephp artisan make:observer UserObserver 是两个常用的命令,分别用于创建 模型工厂模型观察者。它们的使用场景和示例如下:

1. 模型工厂(php artisan make:factory name

使用场景

示例

假设有一个 User 模型,需要生成测试用户数据:

  1. 创建工厂类
    运行命令:
php artisan make:factory UserFactory --model=User

生成文件:database/factories/UserFactory.php

  1. 定义工厂规则
    UserFactory.php 中定义用户数据生成规则:
use App\Models\User;
use Faker\Generator as Faker;

$factory->defineclass, function (Faker $faker {
   return [
	   'name' => $faker->name,
	   'email' => $faker->unique()->safeEmail,
	   'password' => bcrypt('password'), // 默认密码
	   'remember_token' => Str::random(10),
   ];
});
  1. 使用工厂生成数据
    • 在测试中
// 创建一个用户实例并保存到数据库
$user = factoryclass)->create(;
public function run()
{
 factoryclass, 50)->create(; // 创建 50 个用户
}

2. 模型观察者(php artisan make:observer UserObserver

使用场景

示例

假设需要在用户创建后自动发送欢迎邮件:

  1. 创建观察者类
    运行命令:
php artisan make:observer UserObserver --model=User

生成文件:app/Observers/UserObserver.php

  1. 定义观察者方法
    UserObserver.php 中实现事件处理逻辑:
namespace App\Observers;

use App\Models\User;
use Illuminate\Support\Facades\Mail;
use App\Mail\WelcomeEmail;

class UserObserver
{
   // 在用户创建后触发
   public function created(User $user)
   {
	   // 发送欢迎邮件
	   Mail::to($user->email)->send(new WelcomeEmail());
   }

   // 在用户更新前触发
   public function updating(User $user)
   {
	   // 记录更新日志
	   \Log::info("User {$user->id} is about to be updated.");
   }
}
  1. 注册观察者
    在模型的 boot 方法中注册观察者:
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
   protected static function boot()
   {
	   parent::boot();

	   // 注册观察者
	   static::observeclass;
   }
}
  1. 触发观察者逻辑
    当用户创建或更新时,观察者会自动执行对应方法:
$user = new User();
$user->name = 'John Doe';
$user->email = '[email protected]';
$user->save(); // 会触发 created 事件,发送欢迎邮件

3. 结合使用场景

场景:用户注册后自动发送邮件并记录日志

  1. 使用工厂生成测试用户
$user = factoryclass)->create(;
  1. 观察者自动触发
    • 用户创建后,created 方法发送欢迎邮件。
    • 如果用户更新,updating 方法记录日志。

优势

4. 注意事项

$factory->stateclass, 'admin', function (Faker $faker {
  return [
	  'is_admin' => true,
  ];
});

使用时:

$adminUser = factoryclass)->state('admin')->create(;
// 在 saving 事件中设置默认值
public function saving(User $user)
{
  $user->status = $user->status ?? 'active';
}