路由 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 协议》,转载必须注明作者和本文链接
这个还不错?
非常非常实用的功能