如何从RedirectResponse对象强制执行Laravel 5.6重定向?

时间:2018-05-15 15:22:36

标签: php laravel laravel-5.6

我有一个名为Item的自定义非Eloquent类。在构造函数中,Item尝试使用我的应用进行身份验证。然后,我有一个Auth()方法来检查身份验证是否成功,如果没有激发重定向。

public function Auth() {
    if (isset($this->authenticated)) {
        return $this;
    } else {
        return redirect('/auth');
    }
}

我使用Auth方法通过Item Facade静态访问Item。预期的结果是,如果对项进行了身份验证,我们将使用该项作为变量继续索引。如果不是,则会触发重定向。

public function index() {
    $item = Item::Auth();
    return view('index',$item);
}

但是,如果未经过身份验证,则所有发生的事情都会将Laravel RedirectResponse对象传递给索引视图。如何强制重定向实际触发?

我想到但不喜欢的解决方案

if ($item instanceOf RedirectResponse)...在控制器中,但这感觉很笨拙

$item = new Item; if ($item->authenticated)...这对于控制器来说很好,但是我想从应用程序的多个部分触发重定向,这样会有很多代码重用,效率不高。

感谢您的帮助。在Facade前面或发射Redirect对象。

1 个答案:

答案 0 :(得分:0)

您可以使用AuthenticationException

来处理此案例
public function Auth() {
    if (isset($this->authenticated)) {
        return $this;
    } 
    throw new AuthenticationException();
}

身份验证异常将生成重定向登录或JSON路由上的401错误。您当然可以抛出一个不同的异常,并将其作为App\Exceptions\Handler

中的重定向处理

例如:

public function Auth() {
    if (isset($this->authenticated)) {
        return $this;
    } 
    throw new ItemNotAuthorizedException(); //Custom class you need to create
}

Handler.php

 public function render($request, Exception $exception)
 {
    if ($exception instanceof ItemNotAuthorizedException) {
       return redirect("/auth");
    }
    return parent::render($request, $exception);
 }

注意:Laravel 5.6也可能允许异常实现自己的渲染功能,但是你应该参考文档。