1
0
mirror of https://github.com/flarum/core.git synced 2025-05-01 13:07:49 +02:00

Split up HandleErrors middleware into distinct classes

These are completely distinct functionalities, toggled through the
system-wide debug flag. By moving the selection of the middleware
to use to the place where the middleware pipe is built, we make
the middleware itself be unaware of these flags. The two classes
are more focused on what they are doing, with the constructor
dependencies clearly representing their requirements.

In addition, this means we can just use the HandleErrorsWithWhoops
middleware in the installer, which means we do not need to worry
about how to inject a SettingsRepositoryInterface implementation
when flarum is not yet set up.
This commit is contained in:
Franz Liedke 2018-08-14 23:15:50 +02:00
parent 3a0e982df1
commit 7a6e208554
No known key found for this signature in database
GPG Key ID: 9A0231A879B055F4
4 changed files with 51 additions and 21 deletions

@ -17,7 +17,8 @@ use Flarum\Foundation\AbstractServiceProvider;
use Flarum\Frontend\RecompileFrontendAssets;
use Flarum\Http\Middleware\AuthenticateWithSession;
use Flarum\Http\Middleware\DispatchRoute;
use Flarum\Http\Middleware\HandleErrors;
use Flarum\Http\Middleware\HandleErrorsWithView;
use Flarum\Http\Middleware\HandleErrorsWithWhoops;
use Flarum\Http\Middleware\ParseJsonBody;
use Flarum\Http\Middleware\RememberFromCookie;
use Flarum\Http\Middleware\SetLocale;
@ -46,8 +47,11 @@ class AdminServiceProvider extends AbstractServiceProvider
$pipe = new MiddlewarePipe;
// All requests should first be piped through our global error handler
$debugMode = ! $app->isUpToDate() || $app->inDebugMode();
$pipe->pipe($app->make(HandleErrors::class, ['debug' => $debugMode]));
if ($app->inDebugMode()) {
$pipe->pipe($app->make(HandleErrorsWithWhoops::class));
} else {
$pipe->pipe($app->make(HandleErrorsWithView::class));
}
$pipe->pipe($app->make(ParseJsonBody::class));
$pipe->pipe($app->make(StartSession::class));

@ -17,7 +17,8 @@ use Flarum\Foundation\AbstractServiceProvider;
use Flarum\Http\Middleware\AuthenticateWithSession;
use Flarum\Http\Middleware\CollectGarbage;
use Flarum\Http\Middleware\DispatchRoute;
use Flarum\Http\Middleware\HandleErrors;
use Flarum\Http\Middleware\HandleErrorsWithView;
use Flarum\Http\Middleware\HandleErrorsWithWhoops;
use Flarum\Http\Middleware\ParseJsonBody;
use Flarum\Http\Middleware\RememberFromCookie;
use Flarum\Http\Middleware\SetLocale;
@ -49,8 +50,11 @@ class ForumServiceProvider extends AbstractServiceProvider
$pipe = new MiddlewarePipe;
// All requests should first be piped through our global error handler
$debugMode = ! $app->isUpToDate() || $app->inDebugMode();
$pipe->pipe($app->make(HandleErrors::class, ['debug' => $debugMode]));
if ($app->inDebugMode()) {
$pipe->pipe($app->make(HandleErrorsWithWhoops::class));
} else {
$pipe->pipe($app->make(HandleErrorsWithView::class));
}
$pipe->pipe($app->make(ParseJsonBody::class));
$pipe->pipe($app->make(CollectGarbage::class));

@ -13,7 +13,6 @@ namespace Flarum\Http\Middleware;
use Exception;
use Flarum\Settings\SettingsRepositoryInterface;
use Franzl\Middleware\Whoops\WhoopsRunner;
use Illuminate\Contracts\View\Factory as ViewFactory;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
@ -23,7 +22,7 @@ use Psr\Log\LoggerInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Zend\Diactoros\Response\HtmlResponse;
class HandleErrors implements Middleware
class HandleErrorsWithView implements Middleware
{
/**
* @var ViewFactory
@ -45,25 +44,18 @@ class HandleErrors implements Middleware
*/
protected $settings;
/**
* @var bool
*/
protected $debug;
/**
* @param ViewFactory $view
* @param LoggerInterface $logger
* @param TranslatorInterface $translator
* @param SettingsRepositoryInterface $settings
* @param bool $debug
*/
public function __construct(ViewFactory $view, LoggerInterface $logger, TranslatorInterface $translator, SettingsRepositoryInterface $settings, $debug = false)
public function __construct(ViewFactory $view, LoggerInterface $logger, TranslatorInterface $translator, SettingsRepositoryInterface $settings)
{
$this->view = $view;
$this->logger = $logger;
$this->translator = $translator;
$this->settings = $settings;
$this->debug = $debug;
}
/**
@ -74,11 +66,7 @@ class HandleErrors implements Middleware
try {
return $handler->handle($request);
} catch (Exception $e) {
if ($this->debug) {
return WhoopsRunner::handle($e, $request);
} else {
return $this->formatException($e);
}
return $this->formatException($e);
}
}

@ -0,0 +1,34 @@
<?php
/*
* This file is part of Flarum.
*
* (c) Toby Zerner <toby.zerner@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Flarum\Http\Middleware;
use Exception;
use Franzl\Middleware\Whoops\WhoopsRunner;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\MiddlewareInterface as Middleware;
use Psr\Http\Server\RequestHandlerInterface as Handler;
class HandleErrorsWithWhoops implements Middleware
{
/**
* Catch all errors that happen during further middleware execution.
*/
public function process(Request $request, Handler $handler): Response
{
try {
return $handler->handle($request);
} catch (Exception $e) {
return WhoopsRunner::handle($e, $request);
}
}
}