summaryrefslogtreecommitdiff
path: root/app/Exceptions/Handler.php
blob: e9a40776ce43de2b45e383d0f54f3791316a158f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
/**
 * webtrees: online genealogy
 * Copyright (C) 2018 webtrees development team
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
declare(strict_types=1);

namespace Fisharebest\Webtrees\Exceptions;

use Exception;
use Fisharebest\Webtrees\Http\Controllers\ErrorController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Whoops\Handler\PrettyPageHandler;
use Whoops\Run;

/**
 * Convert an exception into an HTTP response
 */
class Handler {
	/**
	 * Render an exception into an HTTP response.
	 *
	 * @param  Request   $request
	 * @param  Exception $exception
	 *
	 * @return Response
	 */
	public function render(Request $request, Exception $exception): Response {
		if ($exception instanceof HttpException) {
			// Show a friendly page for expected exceptions.
			if ($request->isXmlHttpRequest()) {
				$response = new Response($exception->getMessage(), $exception->getStatusCode());
			} else {
				$controller = new ErrorController;
				$response   = $controller->errorResponse($exception);
			}
		} else {
			// Show an error page for unexpected exceptions.
			if (getenv('DEBUG')) {
				// Local dev environment?  Show full debug.
				$whoops = new Run;
				$whoops->pushHandler(new PrettyPageHandler);
				$whoops->handleException($exception);
			} else {
				// Running remotely?  Show a friendly error page.
				$controller = new ErrorController;
				$response   = $controller->unhandledExceptionResponse($request, $exception);
			}
		}

		return $response;
	}
}