Пользователь.метод PHP boot() вызывается несколько раз при регистрации пользователя

Пользователь.метод PHP boot() вызывается несколько раз при регистрации пользователя

12.03.2020 08:41:39 Просмотров 24 Источник

При создании пользователя с помощью встроенного функционала Laravel 7 я вызываю метод boot() в своей пользовательской модели, чтобы назначить UUID новому пользователю. Проблема, с которой я сталкиваюсь, заключается в том, что загрузочный метод get вызывается в общей сложности 4 раза по какой-то причине, вызывая создание 4 разных каталогов на S3.

Приложение / Пользователь.РНР

/**
    * Create the user when this class is called
    *
    * @return void
    */
protected static function boot()
{
    // Setup parent
    parent::boot();

    // Create UUID
    $uuid = Str::uuid();

    // Create user directory on S3
    Storage::disk('s3')->makeDirectory('users/' . $uuid);

    // Assign UUID to new user
    self::creating(function ($model) use ($uuid) {
        $model->id = $uuid;
    });
}

Является ли это правильным способом добавления поля к пользователю при создании? Я попытался добавить его с помощью метода RegisterController.php -> create(), но тогда он ничего не добавит пользователю и приведет к ошибке, сказав, что идентификатор требует значения по умолчанию.

У вопроса есть решение - Посмотреть?

Ответы - Пользователь.метод PHP boot() вызывается несколько раз при регистрации пользователя / User.php boot() method being called multiple times on user registration

Является ответом!
Jason

12.03.2020 08:51:52

Метод boot вызывается всякий раз, когда объект должен быть создан (а не просто сохранен, что и делает creating). Это будет происходить всякий раз, когда Laravel использует функции Auth, например, чтобы получить текущего пользователя, следовательно, несколько вызовов для загрузки.

Вы должны поместить все содержимое в boot (кроме вызова parent::boot()) внутри закрытия creating:

protected static function boot()
{
    // Setup parent
    parent::boot();

    self::creating(function ($model) {

        // Create UUID
        $uuid = Str::uuid();

        // Create user directory on S3
        Storage::disk('s3')->makeDirectory('users/' . $uuid);

        $model->id = $uuid;
    });
}

Больше нет необходимости в use ($uuid) на функции.

Закрыть X