Laravel 5.3 Observer не может получить доступ к модели

У меня есть модель Eloquent User в Laravel. Когда я создаю нового пользователя, я хочу автоматически создать для него токен. Я делаю это с наблюдателем. Но в наблюдателе я не могу добраться до созданной модели, он хочет создать новую.

Моя модель пользователя:

namespace App;

use App\Observers\UserObserver;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token'
    ];

    public static function boot()
    {
        parent::boot();

        static::observe(UserObserver::class);
    }

}

Мой UserObserver

namespace App\Observers;

use App\User;

class UserObserver
{
    public function creating(User $user)
    {
        $user->token = str_random(30);
    }
}

Когда я создаю нового пользователя, я получаю исключение

QueryException в строке 763 Connection.php:

SQLSTATE [23000]: нарушение ограничения целостности: 19 Ошибка ограничения NOT NULL: users.name (SQL: вставить в значения пользователей (token, updated_at, created_at)) (JQYUmmMrRRJT64VcFVA8UzkpY019u6, 2016-10-31 14:33:35, 2016-10- 31 14:33:35))


person tthlaszlo    schedule 31.10.2016    source источник
comment
Ваша ошибка SQL означает, что у вас нет значения для name. Ваш наблюдатель был уволен, а ваш токен - JQYUmmMr .... Так что, возможно, вы создаете пользователя, если передадите значение для имени.   -  person thefallen    schedule 31.10.2016
comment
Да, он хочет создать новый объект вместо добавления значения токена для того, кто инициировал событие. Сначала он создает нового пользователя: в Model :: create (array (array ('_ token' = ›'OHggG8VZCFxLSfGelxaHdIOYQSx05M7o16E2QKB2', 'name' =› 'name', 'mail' = ›'[email protected]', 'password '= ›' 7X194HeFbwl! 85› ',' password_confirmation '= ›' 7X194HeFbwl! 85› '))) в строке 20 RegistrationController.php После того, как он поймает событие и хочет создать нового пользователя без каких-либо атрибутов.   -  person tthlaszlo    schedule 31.10.2016
comment
Пожалуйста, обновите свой вопрос с помощью этого кода.   -  person thefallen    schedule 31.10.2016


Ответы (1)


Похоже, вы не установили name. Вы, наверное, делаете что-то вроде этого:

User:create(Request::all());

но в запросе нет name, поэтому он не будет заполнен. Но также вы установили столбец name как ненулевой, поэтому возникает исключение

person Marcin Nabiałek    schedule 31.10.2016