我有一个名为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对象。
答案 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也可能允许异常实现自己的渲染功能,但是你应该参考文档。