Laravel 5路由分组where规则失效,如何生成指定格式URL?
问题解答
嘿,我来帮你理清楚这个问题~首先你当前的路由代码没法实现目标URL,核心原因有两个:一是你没定义出匹配/product/xxx的路由规则,二是你可能误解了路由前缀where()约束的作用范围。
先看你现在的代码:
Route::prefix('{page}')->name('the_url')->group(function () { Route::get('/', 'HomeController@page') ->name('index'); })->where('page', '(url1|url2)');
这段代码只能匹配http://example.com/url1或http://example.com/url2,完全没处理/product/xxx的部分,所以你想要的url1/product/blabla这类路径自然匹配不到。
接下来给你两种针对性的解决方案:
一、先搞定目标URL的路由定义
如果你要创建/{page}/product/{slug}这类路径(也就是你要的url1/product/blabla),只需要在路由分组里添加对应的路由即可,而且完全不需要给每个路由单独加where()规则——因为前缀上的where()约束会对整个分组内的{page}参数生效:
Route::prefix('{page}')->name('the_url.')->where('page', '(url1|url2)')->group(function () { // 匹配 /url1 或 /url2 Route::get('/', 'HomeController@page')->name('index'); // 匹配 /url1/product/blabla 或 /url2/product/aiueo Route::get('/product/{slug}', 'ProductController@show')->name('product.show'); });
这样设置后:
- 访问
/url1/product/blabla会触发ProductController@show方法,$page参数是url1,$slug参数是blabla - 前缀上的
where('page', '(url1|url2)')会全局限制这个分组里所有路由的{page}只能是url1或url2,不用在每个路由里重复写约束
二、如果要给其他参数加约束怎么办?
要是你还想给{slug}这类路由参数加规则,那确实需要针对每个参数单独设置where(),或者在分组上统一配置多个参数的约束:
比如单独给{slug}加约束:
Route::get('/product/{slug}', 'ProductController@show') ->name('product.show') ->where('slug', '[a-z0-9\-]+');
或者在分组上统一配置多个参数的约束,这样分组内所有用到这些参数的路由都会生效:
Route::prefix('{page}')->name('the_url.')->where([ 'page' => '(url1|url2)', 'slug' => '[a-z0-9\-]+' ])->group(function () { Route::get('/', 'HomeController@page')->name('index'); Route::get('/product/{slug}', 'ProductController@show')->name('product.show'); });
总结一下你的核心疑问
不需要在{page}前缀内的每个路由方法中单独使用where()规则——分组上的where()约束会覆盖整个分组内所有路由对应的参数。你现在的问题主要是没在分组里定义出匹配/product/{slug}的路由,所以才没法生成你想要的URL。
内容的提问来源于stack exchange,提问作者ilubis
相关产品推荐
相关产品推荐

