要重现错误,只需将文件上传到Laravel中超过<!DOCTYPE html>
<html>
<head>
<script>
/* This is the function that gets
called when the user clicks the
button on the main page */
function displayAnswer()
{
document.write(“Just 24 1-hour lessons!”);
}
</script>
</head>
<body>
<h1>My First Program</h1>
<p id=“demo”>How long will it take for me to learn to program? </p>
<button type=“button” onclick=“displayAnswer()”>How many hours?</button>
</body>
</html>
配置中post_max_size
的任何POST路由。
我的目标是简单地捕获错误,以便我可以通知用户他上传的文件太大。说:
php.ini
以上代码在标准Laravel 5(PSR-7)中。它的问题是一旦注入的请求发生错误,该函数就无法执行。从而无法在功能内捕获它。那么如何抓住呢?
答案 0 :(得分:7)
Laravel使用其ValidatePostSize
中间件检查请求的post_max_size
,如果请求的PostTooLargeException
太大,则会抛出CONTENT_LENGTH
。这意味着异常如果在它到达你的控制器之前抛出的方式。
您可以使用render()
中的App\Exceptions\Handler
方法,例如
public function render($request, Exception $exception)
{
if ($exception instanceof PostTooLargeException) {
return response('File too large!', 422);
}
return parent::render($request, $exception);
}
请注意,您必须从此方法返回响应,您不能只是从控制器方法返回一个字符串。
以上回复是复制你问题中示例中的return 'File too large!';
,显然你可以将其更改为其他内容。
希望这有帮助!
答案 1 :(得分:1)
如果您希望向用户添加更多内容更丰富的回复,您还可以重定向到您选择的Laravel视图。
public function render($request, Exception $exception)
{
if ($exception instanceof \Illuminate\Http\Exceptions\PostTooLargeException)
return response()->view('errors.post-too-large');
return parent::render($request, $exception);
}
还注意:
对于要捕获的异常,您应该确保通过使用PostTooLargeException
import语句导入类或只写我的示例中的完整路径来提供use Illuminate\Http\Exceptions\PostTooLargeException;
的正确路径。
答案 2 :(得分:0)
该异常是在会话开始之前呈现的,因此您无法重定向到错误消息。
您可以创建一个新的刀片文件,然后像这样重定向到该文件:
public function render($request, Throwable $exception)
{
if ($exception instanceof \Illuminate\Http\Exceptions\PostTooLargeException) {
return $this->showCustomErrorPage();
}
return parent::render($request, $exception);
}
protected function showCustomErrorPage()
{
return view('errors.errors_page');
//you can also return a response like: "return response('File too large!', 422);"
}
要使用会话显示静态消息:
1。您必须将ValidatePostSize
类从middleware
数组移到middlewareGroups
数组中,紧接StartSession
之后。
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
之后,您可以在Handler.php
中进行
public function render($request, Throwable $exception)
{
if ($exception instanceof \Illuminate\Http\Exceptions\PostTooLargeException) {
return $this->showCustomErrorPage();
}
return parent::render($request, $exception);
}
protected function showCustomErrorPage()
{
return \Illuminate\Support\Facades\Redirect::back()->withErrors(['max_upload' => 'The Message']);
}
像这样在控制器上显示消息:
@error('max_upload')
<div class="alert" id="create-news-alert-image">{{ $message }}</div>
@enderror