路由 fallback 巧妙用

在最近发布的 Laravel 5.5.10 中,路由添加了一个新函数 Route::fallback 。使用这个函数能够很容易解决开发中的两个痛点。

定制 404 页面

在之前的版本中,任何没有匹配的路由请求都会返回 Laravel 默认的 404 页面。你也可以在 views 文件夹下新建一个 errors 文件夹,并且新建一个 404.blade.php 文件来覆盖默认的 404 页面。可是这有一个问题,如果你在错误页面中想显示用户姓名,你是做不到的。因为你无法给自定义错误视图传递数据。同样的你也不可以在自定义错误视图中使用 session,cookie,middleware 等功能。在新版本中 fallback 函数能够很轻松的解决这些问题。

Route::fallback(function (){
    return view('errors.404');
});

就如上面代码所示,你可以使用 fallback 来为所有不存在的路由注册一个默认路由,来处理错误信息。你可以在控制器中记录日志,传递数据。这极大的提高了错误处理的灵活度。
更令人惊喜的是,你可以在 Route::group 也注册一个 fallback 路由,来处理 group 中未注册路由错误。

Route::prefix('admin')->group(function (){

    Route::view('home', 'admin.home');

    Route::fallback(function (){
        return view('admin.errors.404');
    });
});

此时,你所有 admin 子域名下的 404 页面将会变成 admin.errors.404 而不是 errors.404。这允许你更加细致的处理你的错误页面。

为 SPA 注册路由

现代网页开发中越来越流行前后端分离,后端程序只是提供 API 接口,而页面全部交由前端框架来渲染。在前端开发中,我们往往使用 Vue router,React router 来注册前端路由。当我们点击页面上链接时,前端框架发现有匹配的路由,就会阻止默认的跳转,而是去 API 调取数据,渲染相应的组件。并使用 HTML5 pushState 来将点击的网址推到历史纪录中。这很方便,但也存在问题。我们在 laravel 中往往只注册一个路由来显示 SPA 页面,就如之前那段代码,Route::view('home', 'admin.home'); admin.home 页面中加载前端 APP。我们又往往在前端路由中注册:

const routes = [
  { path: '/admin/foo', component: Foo },
  { path: '/admin/bar', component: Bar }
]

当我们在页面上点击 /admin/foo 链接时,页面就会渲染 Foo 组件,并将访问 /admin/foo 的历史推送到浏览器中。但是现在假设我们直接访问 /admin/foo 猜猜会发生什么,没错显示 404 页面。我们并没有在 laravel 中注册这个路由,而是在前端框架中注册了。解决这个问题也很简单,使用新增的 fallback 函数:

Route::prefix('admin')->group(function (){

    Route::view('home', 'admin.home');

    Route::fallback(function (){
        return view('admin.home');
    });
});

这样当你访问 /admin/foo 时,因为没有匹配的路由,就会转到 fallback 路由,并返回 SPA 页面。这时前端框架也会知道你访问的网址,正确的渲染组件。你也不必再像文档上那样辛辛苦苦的配置 nginx 配置,只需一行代码轻松解决问题。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
阿麦

非常非常实用的功能

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!