如何在Laravel中使用路由ID以用户身份进行身份验证

时间:2019-08-22 18:38:44

标签: php laravel authentication laravel-5 laravel-5.8

我想在具有两个角色的登录系统中使用auth:

  • 管理员
  • 用户。

当我将路由重定向到用户时,它失败。

我的控制器:

public function profile($id)
{
    $santri = Santri::find($id);

    return view('santri.profile', ['santri'=>$santri]);
}

我的路线:

Route::group(['middleware' => ['auth', 'checkRole:admin,user']], function () {
    Route::get('/santri/{id}/profile', 'SantriController@profile')->name('profiluser');
});

我如何检查角色:

{
    $santri = Santri::all();

    if(in_array($request->user()->role,$roles))
    {
        return $next($request);
    }

    return redirect()->route('profiluser', $santri);
}

错误:

  

缺少[Route:profiluser] [URI:santri / {id} / profile]所需的参数。

3 个答案:

答案 0 :(得分:2)

错误消息:

  

缺少[Route:profiluser] [URI:santri / {id} / profile]所需的参数。

告诉您缺少此路由的参数:profiluser

正如您在这里看到的那样,您没有使用正确的参数调用路由,而是尝试传递整个对象而不是id,所以要传递的不是这个:

return redirect()->route('profiluser', $santri);

执行以下操作:

return redirect()->route('profiluser', $santri->id);

但是由于您已经传递了整个对象,因此也可以执行此操作,因此将其称为方法B。

您要在此处使用传递的ID查找模型:

public function profile($id)
{
    $santri = Santri::find($id);

    return view('santri.profile', ['santri'=>$santri]);
}

但是由于您已经传递了整个对象,因此可以执行以下操作:

public function profile(Santri $santri)
{
    return view('santri.profile', ['santri' => $santri]);
}

或者这个,在我看来更干净:

public function profile(Santri $santri)
{
    return view('santri.profile', compact('santri'));
}

答案 1 :(得分:1)

您需要传递$santry->id而不是$ santry。将行更改为:

return redirect()->route('profiluser', [$santri->id]);

答案 2 :(得分:0)

根据您的路线:

Route::get('/santri/{id}/profile', 'SantriController@profile')->name('profiluser');

您必须传递用户ID,如下所示:

return redirect()->route('profiluser', ['id' => $request->user()->id]);