Php 如何在委托中分配默认用户角色?

Php 如何在委托中分配默认用户角色?,php,authentication,web,laravel-5,Php,Authentication,Web,Laravel 5,我只想给新注册的用户分配一个角色。我如何才能在拉威尔5中实现这一点?我正在使用委托获取角色和权限 上次我试图在用户注册到供应商文件夹中的文件后触发事件。有没有办法在不修改供应商文件夹中的任何内容的情况下为角色分配触发事件 如果是,那么我应该在哪里触发事件?我不想修改供应商文件夹中的任何内容,如AuthenticatesAndRegistersUsers.php中的postRegister()中的触发事件,因为新的更新将覆盖我的代码 这个链接上的代码看起来不错,但我不知道是否有注册事件。 下面是

我只想给新注册的用户分配一个角色。我如何才能在拉威尔5中实现这一点?我正在使用委托获取角色和权限

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

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

这个链接上的代码看起来不错,但我不知道是否有注册事件。

下面是我在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;
});
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;
});

请帮助我。

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

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

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

Event::fire('auth.register', array($user));
App\Service\registrator.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;
    }
App\Service\registrator.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;
    }

我一个人就想出来了。我是如何做到这一点的:

我从/vendor/laravel/framework/src/illighted/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中的事件侦听器:

// 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;
});
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;
});

我一个人就想出来了。我是如何做到这一点的:

我从/vendor/laravel/framework/src/illighted/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中的事件侦听器:

// 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;
});
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;
});

在Laravel 5.7+中,您可以转到
注册表控制器
并修改
创建
功能:

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;
}

不要忘记
使用App\Models\Role开头。

在Laravel 5.7+中,您可以转到
注册表控制器
并修改
创建
功能:

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;
}

不要忘记
使用App\Models\Role
在开始时。

您的解决方案在
路由上给了我
对null上的成员函数roles()的调用。php
您的解决方案在
路由上给了我
对null上的成员函数roles()的调用。php