1

我使用 Laravel 5.3 中的标准机制认证是通过命令构建的:php artisan make:auth.

因此,它RegisterController使用以下方法创建了控制器:

 protected function create(array $data)
    {

        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]));
    }

因此,我需要扩展此方法以将数据添加到用户表的相关表中。为此,我这样做:

 protected function create(array $data)
    {

        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ])->roles()->attach(Role::where('name', "admin"))->first());
    }

在此之后我得到错误:

FatalThrowableError in SessionGuard.php line 441:
Type error: Argument 1 passed to Illuminate\Auth\SessionGuard::login() must implement interface Illuminate\Contracts\Auth\Authenticatable, null given, called in \vendor\laravel\framework\src\Illuminate\Foundation\Auth\RegistersUsers.php on line 32
4

1 回答 1

3

我没有使用 Laravel 的身份验证逻辑,但看起来用户在创建后立即登录。在 Laravel 中记录用户需要 User 对象,因此:

return User::create([
    'name' => $data['name'],
    'email' => $data['email'],
    'password' => bcrypt($data['password']),
]);

create()方法返回 Model。但是,您添加attach()了 return 语句,如果您查看 API,该方法返回 void最终转换为null错误消息中提到的内容。

你想要做的是这样的:

protected function create(array $data) {

    // Create the User and store the object
    $newUser = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
    ]);

    // Add extra data
    $adminRole = Role::where('name', 'like', 'admin')->first();
    $newUser->roles()->attach($adminRole->id);

    // Return the new User object
    return $newUser;
}

注意:我假设您的表id中有一个列role(s)

于 2016-09-02T20:33:23.140 回答