Handler.php 中的渲染函数无法正常工作 Laravel 8
render function in Handler.php not working Laravel 8
我想在 ModelNotFoundException 发生时 return 一个 JSON 响应而不是默认的 404 错误页面。为此,我将以下代码写入 app\Exceptions\Handler.php
:
public function render($request, Exception $exception)
{
if ($exception instanceof ModelNotFoundException) {
return response()->json([
'error' => 'Resource not found'
], 404);
}
return parent::render($request, $exception);
}
然而它不起作用。当 ModelNotFoundException 发生时,Laravel 只显示一个空白页。我发现即使在 Handler.php
中声明一个空的渲染函数也会使 Laravel 在 ModelNotFoundException.
上显示一个空白页
我该如何解决这个问题,以便 return JSON/execute 覆盖渲染函数中的逻辑?
这是我的处理程序文件:
use Throwable;
public function render($request, Throwable $exception)
{
if( $request->is('api/*')){
if ($exception instanceof ModelNotFoundException) {
$model = strtolower(class_basename($exception->getModel()));
return response()->json([
'error' => 'Model not found'
], 404);
}
if ($exception instanceof NotFoundHttpException) {
return response()->json([
'error' => 'Resource not found'
], 404);
}
}
}
这个仅适用于 API 路由中的所有请求。如果你想捕获所有请求,那么删除第一个 if.
在Laravel8x中,你需要Rendering Exceptions
在register()
方法中
use App\Exceptions\CustomException;
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->renderable(function (CustomException $e, $request) {
return response()->view('errors.custom', [], 500);
});
}
对于ModelNotFoundException
,您可以按如下方式进行。
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
public function register()
{
$this->renderable(function (NotFoundHttpException $e, $request) {
return response()->json(...);
});
}
默认情况下,Laravel 异常处理程序会为您将异常转换为 HTTP 响应。但是,您可以自由地为给定类型的异常注册自定义渲染闭包。您可以通过异常处理程序的 renderable
方法来完成此操作。 Laravel 将通过检查闭包的 type-hint 来推断闭包呈现的异常类型:
的更多信息
此代码对我不起作用(在 Laravel 8.74.0 中):
$this->renderable(function (ModelNotFoundException$e, $request) {
return response()->json(...);
});
不知道为什么,ModelNotFoundException
直接转发给Laravel使用的NotFoundHttpException
(是Symfony Component的一部分),最终会触发404 HTTP 响应。我的解决方法是检查异常的 getPrevious()
方法:
$this->renderable(function (NotFoundHttpException $e, $request) {
if ($request->is('api/*')) {
if ($e->getPrevious() instanceof ModelNotFoundException) {
return response()->json([
'status' => 204,
'message' => 'Data not found'
], 200);
}
return response()->json([
'status' => 404,
'message' => 'Target not found'
], 404);
}
});
然后我们就会知道这个异常来自ModelNotFoundException
和return与NotFoundHttpException
的不同响应。
编辑
This 是 ModelNotFoundException
抛出为 NotFoundHttpException
的原因
我想在 ModelNotFoundException 发生时 return 一个 JSON 响应而不是默认的 404 错误页面。为此,我将以下代码写入 app\Exceptions\Handler.php
:
public function render($request, Exception $exception)
{
if ($exception instanceof ModelNotFoundException) {
return response()->json([
'error' => 'Resource not found'
], 404);
}
return parent::render($request, $exception);
}
然而它不起作用。当 ModelNotFoundException 发生时,Laravel 只显示一个空白页。我发现即使在 Handler.php
中声明一个空的渲染函数也会使 Laravel 在 ModelNotFoundException.
我该如何解决这个问题,以便 return JSON/execute 覆盖渲染函数中的逻辑?
这是我的处理程序文件:
use Throwable;
public function render($request, Throwable $exception)
{
if( $request->is('api/*')){
if ($exception instanceof ModelNotFoundException) {
$model = strtolower(class_basename($exception->getModel()));
return response()->json([
'error' => 'Model not found'
], 404);
}
if ($exception instanceof NotFoundHttpException) {
return response()->json([
'error' => 'Resource not found'
], 404);
}
}
}
这个仅适用于 API 路由中的所有请求。如果你想捕获所有请求,那么删除第一个 if.
在Laravel8x中,你需要Rendering Exceptions
在register()
方法中
use App\Exceptions\CustomException;
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->renderable(function (CustomException $e, $request) {
return response()->view('errors.custom', [], 500);
});
}
对于ModelNotFoundException
,您可以按如下方式进行。
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
public function register()
{
$this->renderable(function (NotFoundHttpException $e, $request) {
return response()->json(...);
});
}
默认情况下,Laravel 异常处理程序会为您将异常转换为 HTTP 响应。但是,您可以自由地为给定类型的异常注册自定义渲染闭包。您可以通过异常处理程序的 renderable
方法来完成此操作。 Laravel 将通过检查闭包的 type-hint 来推断闭包呈现的异常类型:
此代码对我不起作用(在 Laravel 8.74.0 中):
$this->renderable(function (ModelNotFoundException$e, $request) {
return response()->json(...);
});
不知道为什么,ModelNotFoundException
直接转发给Laravel使用的NotFoundHttpException
(是Symfony Component的一部分),最终会触发404 HTTP 响应。我的解决方法是检查异常的 getPrevious()
方法:
$this->renderable(function (NotFoundHttpException $e, $request) {
if ($request->is('api/*')) {
if ($e->getPrevious() instanceof ModelNotFoundException) {
return response()->json([
'status' => 204,
'message' => 'Data not found'
], 200);
}
return response()->json([
'status' => 404,
'message' => 'Target not found'
], 404);
}
});
然后我们就会知道这个异常来自ModelNotFoundException
和return与NotFoundHttpException
的不同响应。
编辑
This 是 ModelNotFoundException
抛出为 NotFoundHttpException