3 回答
TA贡献1744条经验 获得超4个赞
如果你查看源代码,Symfony\Component\HttpKernel\Exception\NotFoundHttpException你会发现它扩展了,Symfony\Component\HttpKernel\Exception\HttpException如果你查看类的声明,你会发现它$statusCode是私有的,但它有一个 getter 方法
class HttpException extends \RuntimeException implements HttpExceptionInterface
{
private $statusCode;
private $headers;
public function __construct(int $statusCode, string $message = null, \Throwable $previous = null, array $headers = [], ?int $code = 0)
{
$this->statusCode = $statusCode;
$this->headers = $headers;
parent::__construct($message, $code, $previous);
}
public function getStatusCode()
{
return $this->statusCode;
}
//...
}
因此,您只需要$exception->getStatusCode()检索状态代码(在您的情况下为 404),尽管您应该进行检查以确保您的 throwable 实现了,因为情况可能HttpExceptionInterface并不总是如此,因此该方法将不存在,您会得到致命错误
if ($exception instanceof \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface) {
$code = $exception->getStatusCode();
}
TA贡献1796条经验 获得超4个赞
我的做法如下,
由于这个问题相对较新,我推测您正在起诉Laravel
版本7或8。根据 的文档Error Handling
,正确的页面渲染方法现在如下
public function render($request, Throwable $exception)
{
if ($exception instanceof CustomException) {
return response()->view('errors.custom', [], 500);
}
return parent::render($request, $exception);
}
为了使用自定义错误视图,您必须告诉您抛出的实例Laravel
类型。要覆盖内部错误处理,您需要捕获作为 HTTP 异常抛出的异常。对于这些版本,正确的类是. 所以,Exception
$exception
Symfony\Component\HttpKernel\Exception\
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
在你的顶部引入处理类app\Exceptions\Handler.php
根据您的场景将默认的 render() 方法修改为如下所示,
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
//
//
public function render($request, Throwable $exception)
{
// return parent::render($request, $exception);
if ($exception instanceof HttpExceptionInterface) {
if (env('APP_ENV') === 'production' && $exception->getStatusCode() == 404) {
return response()->view('errors.404', [], 404);
}
if (env('APP_ENV') === 'production' && $exception->getStatusCode() == 500) {
return response()->view('errors.500', [], 500);
}
}
return parent::render($request, $exception);
}
- 3 回答
- 0 关注
- 157 浏览
添加回答
举报