Laravel Lumen - 处理无效路由

Posted

技术标签:

【中文标题】Laravel Lumen - 处理无效路由【英文标题】:Laravel Lumen - handle invalid route 【发布时间】:2017-05-13 03:09:42 【问题描述】:

在 Lumen 中,如何处理无效路由 (URL)?

Lumen 的 documentation 说要放 abort(404);,但我不适合放这个。

如果我把它放在我的路由文件中,它会给我这个错误

Fatal error: Call to a member function send() on string in C:\....\vendor\laravel\lumen-framework\src\Application.php on line 408

这是引发错误的代码:

protected function handleUncaughtException($e)

    $handler = $this->make('Illuminate\Contracts\Debug\ExceptionHandler');

    if ($e instanceof Error) 
        $e = new FatalThrowableError($e);
    

    $handler->report($e);

    if ($this->runningInConsole()) 
        $handler->renderForConsole(new ConsoleOutput, $e);
     else 
        $handler->render($this->make('request'), $e)->send(); <---line 408
    

这是我的路线文件中的东西(只是添加了一条路线):

$app->group(['middleware' => 'stratus_auth', 'namespace' => 'App\Http\Controllers'], function ($app) 

     $app->get('/login', ['as' => 'login', 'middleware' => 'user_logged', 'uses' => 'LoginController@index']);
     ...
     ...
     ...
     $app->abort(404);
);

我怀疑我没有在路由文件中正确添加 abort 命令。

理想情况下,如果路由无效,我希望它重定向到/ask URL。

感谢任何帮助。如果需要更多信息或代码,请告诉我。我会把它添加到问题中。

-----编辑:-----

如果没有 abort(),我会收到带有无效 URL 的错误:

exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in C:\Empire\LifeLearn\Repos\lifelearn_sofie_application\vendor\laravel\lumen-framework\src\Application.php:1264

这是 Application.php 的第 1264 行

protected function handleDispatcherResponse($routeInfo)

    switch ($routeInfo[0]) 
        case Dispatcher::NOT_FOUND:
            throw new NotFoundHttpException;    <---ln 1264

        case Dispatcher::METHOD_NOT_ALLOWED:
            throw new MethodNotAllowedHttpException($routeInfo[1]);

        case Dispatcher::FOUND:
            return $this->handleFoundRoute($routeInfo);
    

根据 lumen 文档,这是处理似乎正在做的错误的第二种方法。

其次,你可以手动抛出一个 Symfony\Component\HttpKernel\Exception\NotFoundHttpException 的实例。

但是如何在页面上显示 404 页面而不是错误?

【问题讨论】:

修复错误就可以了。显示相关行周围的代码。 要查看应用程序文件中的代码吗?发布在问题中 你一定是在你的路由中传递了错误的东西。你的路线是什么样的? 添加了路由文件的快照。也许我将 abort() 行放在错误的位置? 是的,它需要在路由块内。我目前找不到任何文档。根据记忆,它类似于 $app-&gt;get('*', function () $app-&gt;abort(404); ); 作为文件中的最后一条路由。 【参考方案1】:

我在这些链接的帮助下完成了这项工作:

how-do-i-create-a-custom-404-error-page create-custom-error-pages-in-laravel-5

主要是第一个。 Bestmomo 的回答成功了。如果您想处理不同类型的错误 404、500 等,第二个链接很有用。

我不必在我的路线文件中添加任何内容。 只需按照答案中的描述更改 app/Exceptions/Handler.php 文件。稍后我会在这里详细介绍。

确保在 Handler.php 中添加 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

【讨论】:

以上是关于Laravel Lumen - 处理无效路由的主要内容,如果未能解决你的问题,请参考以下文章

Lumen/Laravel - 使用自定义路由器

Laravel/Lumen Auth JWT 令牌在后续请求中无效,它可能已过期吗?

如何将 Angular js 路由与 laravel/lumen 路由一起使用?

为速度而生的Laravel框架Lumen-路由与中间件

Laravel Lumen 从路由调用工匠命令

Laravel / Lumen Auth JWT令牌在后续请求中无效,是否可能已过期?