根据在laravel控制器中使用if条件提到的角色,重定向到laravel中的不同视图

时间:2017-12-27 06:36:40

标签: laravel laravel-5.4

在laravel中,我有学生,家长,员工(教师,图书管理员,监护人)角色具有不同的权限...基于用户角色,当用户登录时,它应该重定向到不同的刀片文件。我的问题是如果用户父母或学生它正在重定向到不同的仪表板,但每当用户是教师或其他人没有登录但在用户表中已经存在用户。

下面是我的LoginController代码

LoginController.php:

public function login(Request $request){


    if(Auth::attempt([

          'email'=>$request->email,
          'username'=>$request->username,
          'password'=>$request->password,


    ]))

    {
        $user=User::where('username',$request->username)->first();
        $usertype=$user->user_type;
        $username=$user->username;

        $roles=DB::table('roles')->where('id','=',$usertype)->first();

        $rolename=$roles->role_name;



        if($rolename=="student"){

           $student=DB::table('students')->where('stud_adm_id','=',$username)->first();
           $classid=$student->class_id;
           $sectionid=$student->section_id;
           $class=DB::table('classtables')->where('id',$classid)->first();
          $section=DB::table('sections')->where('id',$sectionid)->first();

          return view('studentdashboard',compact('student','class','section'));

        }elseif($rolename=="Teacher"){



          $employeedetails=DB::table('employees')->where('employee_fname','=',$username)->first();

        return view('teacherdashboard',compact('employeedetails'));

    }
        elseif($rolename=="parent"){

            $parentdetails=DB::table('parents')->where('mother_phone','=',$username)->first();
           $stateid=$parentdetails->state;
           $state=DB::table('states')->where('state_id','=',$stateid)->first();

            return view('parentdashboard',compact('parentdetails','state'));

      }

  }else{


 return redirect()->back();

  }
}

我在角色表中提到了我的角色,而且这个id存储在用户表

提前致谢...

3 个答案:

答案 0 :(得分:1)

您最好创建一个中间件来检查用户角色,并根据角色将用户重定向到不同的页面!

运行以下命令创建一个检查用户角色的中间件。

php artisan make:middleware CheckRoleMiddleware

该命令将在名为App\Http\Middleware的{​​{1}}下创建一个文件,此类将出现一个预定义的方法CheckRoleMiddleware,您可以在其中放置检查用户角色的逻辑并将其重定向到不同的页面示例:

handle()

不要忘记将<?php namespace App\Http\Middleware; use Closure; class CheckRoleMiddleware { public function handle($request, Closure $next) { //User role is admin if ( Auth::check() && Auth::user()->isAdmin() ) { return $next($request); } //If user role is student if(Auth::check() && auth()->user()->role === 'student') { return view('studentDashboard'); or route('routeName'); } //If user role is teacher if(Auth::check() && auth()->user()->role ==='teacher') { return view('teacherDashboard'); or route('routeName'); } //default redirect return redirect('home'); } } 添加到CheckRoleMiddleware

App\Http\Kernel.php

答案 1 :(得分:0)

让我们忽略关于这些东西应该如何工作的一切以及它默认情况下的工作方式以及你拥有的东西。

你觉得这里有问题吗?

if ($rolename == "student")

elseif ($rolename == "Teacher")

elseif ($rolename == "parent")

如果没有,让我们这样试试:

student
Teacher
parent

哪一个与其他人不一样?哪一个是&#34;没有工作&#34;正确?

我想假设您以一致的方式命名这些角色,因此Teacher应为teacher

答案 2 :(得分:-3)

您可以通过覆盖一两个方法来完成默认LoginController的所有操作。

您不应该从处理路径返回视图。 POST REDIRECT GET。 POST进来,返回一个REDIRECT,导致GET请求(很可能会返回一个视图)。

用于验证登录凭据:

protected function validateLogin(Request $request)
{
    $this->validate($request, [
        'email' => '...',
        'username' => '...',
        'password' => '...',
    ]);
}

请求使用哪些凭据:

protected function credentials(Request $request)
{
    return $request->only('email', 'username', 'password');
}

验证成功后返回的响应:

protected function authenticated(Request $request, $user)
{
    // do your role checking here
    // return a redirect response to where you want that particular user type to go
    // return redirect()->route(...);
}

与构建视图和收集数据相关的一切都是它自己的路径。您所要做的就是返回登录流程的重定向。您重定向到的位置负责收集显示视图所需的数据。