Laravel重定向不起作用

时间:2015-12-30 15:40:02

标签: php laravel-5 laravel-routing

我正在使用Laravel 5.1。我的控制器专门用于管理员用户。所以我检查用户是否是管理员。这是我的代码。

public function getAdminData()
  {
    $this->checkAdminStatus();
    return response()->json(array('admin-data'));
  }
public function checkAdminStatus()
  {
    $userManager = new UserManager();
    if(!$userManager->isAdmin())
    {
        return redirect()->route('returnForbiddenAccess');
    }
  }

我的路线是

Route::any('api/app/forbidden',['uses' =>'ErrorController@returnNonAdminErrorStatus','as'=>'returnForbiddenAccess']);

现在,如果用户不是管理员,那么它不应该返回admin-data,而是返回。在redirect()->route通话后它不应该停止处理逻辑吗? 这也是纯粹的REST应用程序。

2 个答案:

答案 0 :(得分:3)

为什么不根据需要使用Laravel Middleware解决方案?您可以将中间件链接到控制器,检查当前用户是否是管理员,如果不是,则重定向:

//You Middleware Handle method
public function handle($request, Closure $next)
{
  if ($this->auth->guest() || !($this->auth->user()->isAdmin))
  {
        return redirect('your/url')->with('error','no admin');;
  }
return $next($request);
}

您可以在构造方法

中为控制器添加或多个中间件
//your controller
public function __construct(Guard $auth, Request $request){
    $this->middleware('auth', ['except' => ['index', 'show']]); //here one 'auth' middleware
    $this->middleware('admin', ['only' => ['index', 'show', 'create','store']]); //here the admin middleware
}

注意允许或禁止某些控制器方法的中间件的onlyexcept参数

检查中间件上的laravel documentation以获取更多信息:)

答案 1 :(得分:1)

不,你的逻辑略有缺陷。您从checkAdminStatus()发回的返回值只是被忽略并丢弃:

public function getAdminData()
{
    // You don't have $redirectValue in your code, but imagine it 
    // is there. To actually redirect, you need to return this value
    // from your controller method
    $redirectValue = $this->checkAdminStatus();

该重定向没有做任何事情。每次请求都会发生从控制器返回的时间。我会建议更像这样的东西:

public function getAdminData(UserManager $userManager)
{
    if($userManager->isAdmin()) {
        return response()->json(array('admin-data'));
    }

    return redirect()->route('forbidden-access');
}

我认为这会捕捉到您的问题的精神:如果用户是管理员,唯一一次返回此处的是

另外,您在一个案例中返回JSON数据,在另一个案例中返回重定向。这可能不是一个好主意。我的理由是,通常,JSON数据是为了响应AJAX请求而返回的,根据我的经验,在失败的情况下很少跟进实际重定向。 <子>(YMMV)