如何在委托中指定默认用户角色?

时间:2015-06-08 10:14:20

标签: php authentication web laravel-5

我只想为新注册的用户分配一个角色。我如何使用Entrust在Laravel 5中实现这一目标?我正在使用Entrust作为角色和权限。

上次我尝试在用户注册后在供应商文件夹中的文件中触发事件。有没有办法在不修改供应商文件夹内的任何内容的情况下触发角色分配事件?

如果是,那么我应该在哪里开火?我不想修改我的供应商文件夹中的任何内容,例如在postRegister()中的AuthenticatesAndRegistersUsers.php中触发事件,因为新的更新将覆盖我的代码。

此链接上的代码看起来不错,但我不知道委托是否有注册事件。 http://laravel.io/forum/07-02-2014-entrust-assign-role-on-user-signup

这是我在routes.php中的代码:

// this event is firing on user login and i am getting user object
Event::listen('auth.login', function($user) {
   var_dump($user);
   die(__LINE__);
});

// this event is not firing on user registration
Event::listen('auth.register', function($user) {
   var_dump($user);
   die(__LINE__);
   //   $donor_role = DB::table('app_roles')->where('name', '=', 'donor')->pluck('id');
   //   $user->roles()->attach($donor_role);
   //   return false;
});

请帮帮我。

4 个答案:

答案 0 :(得分:3)

应用\服务\ Registrar.php 这是我的方式:

public function create(array $data)
    {
        $create = User::create([
            'username' => $data['username'],
            'email' => $data['email'],
            'password' => $data['password'],
        ]);


        $user = User::find($create->id);

        $role = Role::where('name', '=', 'user')->firstOrFail();

        $user->roles()->attach($role->id);

        return $create;
    }

答案 1 :(得分:1)

我自己想通了。以下是我的成就:

我从 /vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesAndRegistersUsers.php 复制了postRegister()函数,并在 / app / Http / Controllers / Auth /中重写AuthController.php 经过一些修改。

以下是AuthController.php中的修改函数:

public function postRegister(Request $request) {
    $validator = $this->registrar->validator($request->all());
    if ($validator->fails()) {
        $this->throwValidationException(
                $request, $validator
        );
    }
    $this->auth->login($this->registrar->create($request->all()));
    // little modification :-)
    \Event::fire('auth.assign_default_role', $this->auth->user());
    return redirect($this->redirectPath());
}

这是routes.php中的事件监听器:

Event::listen('auth.assign_default_role', function($user) {
    $donor_role = DB::table('app_roles')->where('name', '=', 'donor')- >pluck('id');
    $user->roles()->attach($donor_role);
    return false;
});

答案 2 :(得分:0)

您可以从正在处理实际注册的控制器中触发注册事件。

Event::fire('auth.register', array($user));

答案 3 :(得分:0)

在Laravel 5.7+中,您可以转到RegisterController并修改create函数:

protected function create(array $data) {
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);

    $default_role = Role::where('name', 'DEFAULT_ROLE_NAME')->first();
    $user->attachRole($default_role);

    return $user;
}

别忘了在一开始就use App\Models\Role;