Laravel添加动态路由后Fortify路由失效,如何设置其优先级更高?
解决Laravel动态路由与Fortify路由冲突的问题
你遇到的问题根源在于Laravel的路由匹配是按注册顺序执行的,你定义的动态路由/{teamslug}/{featureslug?}会优先匹配所有以任意字符串开头的路径,包括/login这类Fortify的固定路由,导致Fortify的路由根本没机会被匹配到。
有两种实用的解决办法:
方法一:调整路由注册顺序
直接把Fortify的路由注册放在你的动态路由前面,让Laravel先匹配Fortify的固定路由,再处理动态路由。
在routes/web.php中按以下顺序编写:
// 先注册Fortify路由 Fortify::routes(); // 再定义你的动态路由 Route::get('/{teamslug}/{featureslug?}', [SomeController::class, 'show']);
这样/login这类固定路径会被优先匹配,不会被动态路由拦截。
方法二:给动态路由添加参数约束
如果不方便调整路由注册顺序,可以给teamslug参数添加正则约束,让它排除Fortify的路由关键词。
示例代码:
Route::get('/{teamslug}/{featureslug?}', [SomeController::class, 'show']) ->where('teamslug', '^(?!login|register|forgot-password|reset-password|verify-email).+$');
这里用了正则的负向前瞻规则,意思是teamslug不能是login、register这些Fortify的路由字符串,你可以根据自己实际使用的Fortify路由,补充更多需要排除的关键词。
内容的提问来源于stack exchange,提问作者Roeland
相关产品推荐
相关产品推荐

