如何在Laravel中捕获PostTooLargeException?

时间:2017-03-19 05:14:38

标签: php laravel post error-handling

要重现错误,只需将文件上传到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)中。它的问题是一旦注入的请求发生错误,该函数就无法执行。从而无法在功能内捕获它。那么如何抓住呢?

3 个答案:

答案 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,
  1. 之后,您可以在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']);
     }
    
  2. 像这样在控制器上显示消息:

     @error('max_upload')
     <div class="alert" id="create-news-alert-image">{{ $message }}</div>
     @enderror