【问题标题】:I am solving the issues but I have got error that trying to get property 'user_role' of non object我正在解决问题,但我遇到错误,试图获取非对象的属性“user_role”
【发布时间】:2020-02-05 22:14:13
【问题描述】:

我有一个代码默认内置身份验证 LoginController@login login 功能被覆盖,我也有一个 users 表。基本上,我正在从单个登录页面创建面板(管理员、员工)。当 user_role 管理员存在时,打开一个 admin 页面,否则不要登录该页面。与员工页面相同。

【问题讨论】:

  • 管理员存在意味着users 表至少有一个用户拥有admin 角色?我说的对吗?
  • 是的,我已经为 users 表输入了虚拟记录。
  • 用户角色的字段名称是什么?请出示您的控制器代码,以便我解决您的问题。
  • 这里有 LoginController@login
  • 受保护的函数 login() { if (Auth::user()->user_role == 'admin') { return 'index/admin'; } elseif (Auth::user()->user_role == 'staff') { return 'index/staff'; } elseif (Auth::user()->user_role == 'student') { return 'index/student'; } else { 返回重定向('/home'); } }

标签: laravel laravel-6


【解决方案1】:

如果您在此代码中“尝试获取非对象的属性 'user_role'”

Auth::user()->user_role

这基本上意味着你的用户没有登录,因此Auth::user()返回null,尝试dd(Auth::user())验证这一点。

如果是这种情况,您将不得不更深入地挖掘这条线索。

【讨论】:

    【解决方案2】:

    In LoginController.php文件

    删除

     protected $redirectTo = '/home';
    

    添加

    Illuminate\Support\Facades\Auth; /*Add facade above controller class name*/
    
    public function redirectTo(){
    
        // User role
        $role = Auth::user()->user_role; 
    
        // Check user role
        switch ($role) {
            case 'admin':
                return 'index/admin';
            break;
            case 'staff':
                return 'index/staff';
            break; 
            case 'student':
                return 'index/student';
            break; 
            default:
                return '/home'; 
            break;
         }
    }
    

    【讨论】:

      【解决方案3】:

      在你的 login redirect 页面试试这个:

      @auth
          @if(\Auth::user()->user_role == 'admin')
            //admin panel
          @elseif(\Auth::user()->user_role == 'staff')
           //staff panel
          @endif
      @endauth
      

      您无需更改 LoginController 中的任何内容,因为它已由 middleware('auth') 处理。这将隐藏不属于的组件当前用户和未注册用户无法登录。

      【讨论】:

      • 其实我不知道认证码需要粘贴到哪里?我创建了很多页面。登录页面、学生、员工、管理页面。
      • 我以为您只是为每个用户角色制作一个面板,并在登录后查看他们各自的数据。因此,您必须将每个用户角色重定向到各自的页面。您必须使用模型方法并使用关系。您需要为每个用户角色创建一个单独的表,这将使其更加复杂。我的方法很简单,因为您只需要在 users 表中添加一列。
      • ` Route::middleware(['admin'])->group(function () { Route::get('/admin',function (){ return view('admin'); }); Route::get('/student',function (){ return view('student'); }); Route::get('/staff',function (){ return view('staff'); }); }); `
      • Laravel 最常用的方法是使用模型和关系方法。尝试我上面的方法,只需为每个用户角色添加一个条件,或者您可以尝试 Amit 的答案,但他的方法存在问题。其他用户角色登录后可以访问其他用户角色的页面,因为不再检查用户角色。
      猜你喜欢
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 2018-11-18
      • 2014-10-28
      • 2018-05-23
      相关资源
      最近更新 更多