基于另一个刚刚创建的模型的某些字段创建一个新模型(多态) - Laravel 8

Create a New Model (Polimorphic) based on some of the fields of another just created Model - Laravel 8

我想对代码进行增强,实际上感觉很乱。

当我创建一个具有 'email' 字段的用户时。我还需要基于相同的数据创建电子邮件模型(多态)。

其实UserController的“store”方法看起来有点大。那么,有没有另一种方法来挂钩创建事件,然后创建电子邮件。以下是我现在的做法:

$user = User::make($request->safe()->except('active', 'is_contact', 'groups', 'password'));
$user->password = Hash::make($request->password);
$user->active = (!empty($request->active)) ? 1 : 0;
$user->is_contact = (!empty($request->is_contact)) ? 1 : 0;
$user->save();

$this->saveEmail($user);

和保存电子邮件:

private function saveEmail($user)
{
    $email = new Email;
    $email->fill([
        'email' => $user->email,
        'email_type' => 'primary',
        'main' => 1,
    ]);

    $user->emails()->save($email);
}

那么,有没有其他方法可以在控制器之外执行此操作? 不管怎么说,还是要谢谢你。埃尔南.

有一种更简洁的方法可以做到这一点,那就是使用 laravel 观察器。 你可以通过两种方式做到这一点:-

第一种方式,在用户模型中添加创建函数,每次创建用户时都会触发

public static function boot() {
    parent::boot(); 
    //once created/inserted successfully this method fired, so I tested foo 
    static::created(function (User $user) {
       $email = new Email;
       $email->fill([
           'email' => $user->email,
           'email_type' => 'primary',
             'main' => 1,
       ]);
       $user->emails()->save($email);  
    });
}

第二,你可以在一个单独的观察者中 class 看到 link :- https://laravel.com/docs/8.x/eloquent#observers