Дефолтные записи Laravel
Как в laravel при регистрации нового пользователя создавать дефолтные записи в базе ?
К примеру зарегистрировался новый пользователь, а в таблицу menu добавить запись
id | name | user_id
--------------------
1 Фуршет 20
какой механиз использовать для этого ?
Ответы (1 шт):
Есть несколько вариантов:
Самый простой и банальный способ - это создать новую запись после регистрации пользователя:
$user->save();
(new Menu())
->setUserId($user->getId())
->setName('Фуршет')
->save();
Скорее всего, бизнес логика обработки после регистрации пользователя будет рости, по этому это не лучший способ, так как метод регистрации будет делать слишком много того, что он делать не должен. Еще один недостаток этого способа - бизнес логика в контроллере, этого стоит избегать.
Более лучший способ - использовать события
Самый простой способ - добавить логику обработки события создания пользователя в модель User:
protected static function boot(): void
{
parent::boot();
static::created(function (self $model) {
event(new CreateUserEvent($model));
});
}
CreateUserEvent - класс обработки события. Событие могут обрабатывать несколько слушателей(Listener).
class CreateUserEvent
{
private $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function getUser(): User
{
return $this->user;
}
}
class CreateUserListener
{
public function handle(CreateUserEvent $event): void
{
$user = $event->getUser();
(new Menu())
->setUserId($user->getId())
->setName('Фуршет')
->save();
}
}
Это решение лучше потому что вы сможете добавлять слушателей при разрастании бизнес-логики. Вся логика будет находится в отдельном классе.
Недостаток этого способа в том, что вы завязываетесь на создание пользователя. Это может быть проблемой если у вас в системе есть несколько способов создать пользователя. И не во всех случаях должна отрабатывать данная логика.
Еще один недостаток этого способа - бизнес логика в модели, этого стоит избегать.
Более лучший способ - создать событие UserRegistrationEvent и вызывать его не в модели, а в коде обработки регистрации.
Саму логику создания новой модели лучше вынести в репозиторий или сервис, а в слушателе передавать управление ему.