Настройка кастомной страницы 404

Если вы хотите динамически управлять содержимым ошибки 404, например, возвращая JSON-данные {"code":"404", "msg":"404 not found"} при AJAX-запросах, или отображая шаблон app/view/404.html при обычном запросе, смотрите следующий пример.

Ниже представлен пример с использованием оригинального PHP-шаблона; для других шаблонов twig, blade, think-template принцип аналогичен.

Создайте файл app/view/404.html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>404 not found</title>
</head>
<body>
<?=htmlspecialchars($error)?>
</body>
</html>

Добавьте следующий код в config/route.php:

use support\Request;
use Webman\Route;

Route::fallback(function(Request $request){
    // Возврат JSON при AJAX-запросах
    if ($request->expectsJson()) {
        return json(['code' => 404, 'msg' => '404 not found']);
    }
    // Возврат шаблона 404.html при обычном запросе
    return view('404', ['error' => 'some error'])->withStatus(404);
});

Настройка кастомной страницы 405

С версии webman-framework 1.5.23 функция обратного вызова поддерживает передачу параметра status. Если status равен 404, это означает, что запрос не существует, 405 указывает на то, что текущий метод запроса не поддерживается (например, маршрут, заданный через Route::post(), доступен через GET).

use support\Request;
use Webman\Route;

Route::fallback(function(Request $request, $status) {
    $map = [
        404 => '404 not found',
        405 => '405 method not allowed',
    ];
    return response($map[$status], $status);
});

Настройка кастомной страницы 500

Создайте файл app/view/500.html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>500 Internal Server Error</title>
</head>
<body>
Кастомный шаблон ошибки:
<?=htmlspecialchars($exception)?>
</body>
</html>

Создайте файл app/exception/Handler.php (если директория не существует, создайте ее)

<?php

namespace app\exception;

use Throwable;
use Webman\Http\Request;
use Webman\Http\Response;

class Handler extends \support\exception\Handler
{
    /**
     * Отображение и возврат
     * @param Request $request
     * @param Throwable $exception
     * @return Response
     */
    public function render(Request $request, Throwable $exception) : Response
    {
        $code = $exception->getCode();
        // Возврат JSON-данных при AJAX-запросах
        if ($request->expectsJson()) {
            return json(['code' => $code ? $code : 500, 'msg' => $exception->getMessage()]);
        }
        // Возврат шаблона 500.html при обычном запросе
        return view('500', ['exception' => $exception], '')->withStatus(500);
    }
}

Настройте config/exception.php

return [
    '' => \app\exception\Handler::class,
];