Php 拉威尔重定向不';行不通

Php 拉威尔重定向不';行不通,php,laravel-5,laravel-routing,Php,Laravel 5,Laravel Routing,我使用的是Laravel5.1。我的控制器是专门为管理员用户设计的。所以我检查用户是否是管理员。这是我的代码 public function getAdminData() { $this->checkAdminStatus(); return response()->json(array('admin-data')); } public function checkAdminStatus() { $userManager = new UserMan

我使用的是Laravel5.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']);
现在,若用户不是管理员,那个么它不应该返回
管理员数据
,而是返回。在调用
redirect()->route
之后,它不应该停止处理逻辑吗?
这也是纯粹的REST应用程序。

不,您的逻辑有点缺陷。从
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)

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

//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
}
请注意,除了允许或不允许某些控制器方法使用中间件的参数之外,只有和


查看中间件以了解更多信息:)

实际上之前我只是在做这件事。但接下来我会在整个控制器中重新编写同样的代码,我试图应用DRY原理。如果我将中间件注入其中会怎么样,因为这对于整个控制器来说是常见的?是的,如果这个代码将被反复使用,那么将它放在中间件中是有意义的。在这种情况下,我将否定if语句(
if(!$manager->isAdmin())
),然后仅在这种情况下返回重定向。在你的控制器中,然后你只返回管理员数据JSON。嗯,是的,你能告诉我,我是否可以向我的控制器添加更多的中间件,如果可以,那么如何添加?如果该控制器仅用于管理员,你为什么要检查控制器中是否有管理员?使用中间件,它将为您进行检查,如果有人经过身份验证和授权,让他们通过控制器。否则,将其发送到授权页面。这个逻辑不是在控制器中完成的,而是在中间件中完成的,正如Jiedara的回答。嗯,这似乎是正确的方法,您能告诉我如何向控制器添加多个中间件吗?