【问题标题】:Assign specific roles from where the user clicks分配用户单击的特定角色
【发布时间】:2020-01-27 09:48:23
【问题描述】:

我想根据用户点击的按钮来分配角色:

例如: - 如果您单击我想成为顾问,请重定向到 Laravel 注册表并分配顾问角色。 - 如果用户点击我想成为买家,他们会重定向到 Laravel 注册表并分配买家角色。

但我不知道该怎么做。 我的“RegisterController”中有这段代码:

protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
       //'password' => Hash::make($data['password']), //mutador en User model
        'password' => $data['password'],
        'surname1' => $data['surname1'],
        'surname2' => $data['surname2'],
        'comunidad_id' => $data['cbx_comunidad'],
        'provincia_id' => $data['cbx_provincia'],  
        'municipio_id' => $data['cbx_municipio'],
    ]);

    //dd(Request::url());
    // $user->assignRole('Asesor');
    //quiero asignar varios roles depende de el botón que clicken

    return $user;

}

目前,我所做的是在调用视图“注册”的视图中添加这样一个参数:

href="{{ route('register','Asesor') }}"

并在“注册”视图中以隐藏的方式邮寄:

<div class="form-group">
<?php
  $pos = strpos(Request::fullUrl(), '?');                       
  $cadena = substr (Request::fullUrl() , $pos+1, strlen(Request::fullUrl()) );                                                
?>
  <input type="hidden" name="role" id="role" value="{{ $cadena }}">
</div>

然后在控制器中我这样做:

if ($data['role'] == 'Asesor=')
{
   $user->assignRole('Asesor');
}
return $user;

但我不知道这是否是正确的行为方式。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    我认为,您可以处理这样的事件: 在您的 EventServiceProvider 类中,在您的属性 $listen 中创建一个项目:

    'App\Events\User\Created' => ['App\Listeners\User\AssignRoles'],
    

    之后,你要运行命令:

    php artisan event:generate
    

    现在,您需要在声明受保护属性 $dispatchesEvents 的 User 类中打开此事件,如下所示:

    protected $dispatchesEvents = ['created' => 'App\Events\User\Created'];
    

    在您的 User 类中调用 create 方法后,将调用 created 事件并运行 AssignRoles 逻辑。

    在您的 App\Events\User\Created 类中,您需要将 User 注入 __construct 方法,如下所示:

    public $user;
    
    public function __construct(User $user)
    {
        $this->user = $user;
    }
    

    记得放上User类的完整路径!

    这是将要填充来自 User::create 方法的数据的对象。

    在您的 Listener AssignRoles 中,您将事件与填充的用户关联起来,您可以通过以下方式获取它:

    public function handle(Created $event)
    {
        $event->user;
        // ...
    }
    

    在您的 Listener AssignRoles 中,您可以在 __construct 方法中获取所有 Requested 参数:

    private $request;
    public function __construct(Illuminate\Http\Request $request)
    {
        $this->request      = $request;
    }
    

    有了请求的参数,您可以根据句柄方法中单击的按钮应用逻辑:

    public function handle(Created $event)
    {
        $event->user;
        // here is the best place to do all the logic about roles that is going to be attached in this user. E.g:
        switch($role = $this->request->role) {
            case $role == 'Asesor':
                $event->user->roles()->assignRole('Asesor');
            break;
            case $role == 'Buyer':
                $event->user->roles()->assignRole('Buyer');
            break;
        }
    }
    

    要将角色参数发送到请求中,您需要创建一个带有隐藏元素的表单,

    <input type='hidden' name='role' />
    

    创建多个提交按钮来填充角色隐藏元素

    <input type='submit' value='I want to be an Advisor' onClick='setRole("Advisor")' />
    
    <input type='submit' value='I want to be a Buyer' onClick='setRole("Buyer")' />
    

    而且,最后你需要一个 setRole js 方法的逻辑。好看。 ;-)

    【讨论】:

      【解决方案2】:

      用于为用户分配角色。

      控制器功能会这样。

       /* assign role */
      
              if(is_array($request['role']))
              {
                  foreach($request['role'] as $d)
                  {
                      $user->roles()->attach(Role::where('id',$d)->first());
                  }
      
              }
      
             return redirect()->route();
      

      【讨论】:

        猜你喜欢
        • 2014-12-14
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        相关资源
        最近更新 更多