Как Laravel создает представление 404, когда маршрут не определен - PullRequest
1 голос
/ 04 июня 2019

Я работаю, пытаясь понять Laravel под капотом, так как лично это помогает мне учиться и помнить, как что-то работает. Я не могу понять, как работает основной 404.

Я пробовал много var_dumping в Illuminate\RoutingRouteCollection.php на 157

public function match(Request $request)
{
    $routes = $this->get($request->getMethod());

    // First, we will see if we can find a matching route for this current request
    // method. If we can, great, we can just return it so that it can be called
    // by the consumer. Otherwise we will check for routes with another verb.
    $route = $this->matchAgainstRoutes($routes, $request);

    if (! is_null($route)) {
        return $route->bind($request);
    }

    // If no route was found we will now check if a matching route is specified by
    // another HTTP verb. If it is we will need to throw a MethodNotAllowed and
    // inform the user agent of which HTTP verb it should use for this route.
    $others = $this->checkForAlternateVerbs($request);

    if (count($others) > 0) {
        return $this->getRouteForMethods($request, $others);
    }


    throw new NotFoundHttpException;
}

Это выглядит так, как будто это должно быть NotFoundHttpException, которое выводит представление 404, но я не могу понять, как?

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

когда страница не найдена, она выдаст NotFoundHttpException,

есть прервать метод vendor/laravel/framework/src/Illuminate/Foundation

public function abort($code, $message = '', array $headers = [])
{
    if ($code == 404) {
        throw new NotFoundHttpException($message);
    }

    throw new HttpException($code, $message, null, $headers);
}

laravel предоставляет различные представления для кодов ошибок: внутри Exceptions/views есть представления, доступные для

401,403,404,419,429,500,503

, теперь внутри Illuminate\Foundation\Exceptions

есть обработчик внутри Handler.php: renderHttpException метод используется дляотображать представления в соответствии с кодом состояния Exception.

например:

1) renderHttpException: этот метод проверяет, существуют ли представления для данного кода состояния, а затем возвращать представление.

/**
     * Render the given HttpException.
     *
     * @param  \Symfony\Component\HttpKernel\Exception\HttpException  $e
     * @return \Symfony\Component\HttpFoundation\Response
     */
    protected function renderHttpException(HttpException $e)
    {
        $this->registerErrorViewPaths();

        if (view()->exists($view = "errors::{$e->getStatusCode()}")) {
            return response()->view($view, [
                'errors' => new ViewErrorBag,
                'exception' => $e,
            ], $e->getStatusCode(), $e->getHeaders());
        }

        return $this->convertExceptionToResponse($e);
    }

2) registerErrorViewPaths: этот метод регистрирует путь для представлений об ошибках

 /**
     * Register the error template hint paths.
     *
     * @return void
     */
    protected function registerErrorViewPaths()
    {
        $paths = collect(config('view.paths'));

        View::replaceNamespace('errors', $paths->map(function ($path) {
            return "{$path}/errors";
        })->push(__DIR__.'/views')->all());
    }

сейчас, если вы хотите создать свою собственную страницу 404 и хотите отобразить ее тогда:

внутри app/Exceptions/Handler.php

 public function render($request, Exception $exception)
 {
        if($this->isHttpException($exception)){
            switch ($exception->getStatusCode()) {

                case 404:
                    return view('path-to-custom404-here');
                    break;

            }
        }
        return parent::render($request, $exception);
}
0 голосов
/ 04 июня 2019

Laravel предоставляет обработчик исключений по умолчанию App\Exceptions\Handler, который реализует метод render, который превращает исключение в ответ HTTP.

Вызывается обработчик исключенияHttp/Kernel.php в блоке try catch. Смотрите здесь .

...