Laravel路由:如何在uri中添加可选参数


Laravel routing: how to prepend optional parameter in uri?

实现API Rest服务我面临的问题是如何/在url签名中传递API版本。

通过阅读,我决定传递这样的版本

http://mydomainservice.tld/api/version/entity..。

关于将版本视为可选并解析引用最新API版本的请求,这将是意图:

http://mydomainservice.tld/version/entity..。

问题不在于如何管理/安排API rest中的版本控制,而在于是否有机会实现路由规则以在URI中添加可选参数:

正在运行:

Route::group(['prefix' => 'api/'], function(){
  Route::get('{v}/subscribers', 'APIRequestController@show');
  Route::get('subscribers', 'APIRequestController@show);
});

对于两个调用,如:

http://mydomain.tld/api/subscribershttp://mydomain.tld/api/1/subscribers

但是我想用一条规则来解决它:

Route::get('{v?}/subscribers', 'APIRequestController@show');

但是如果我试图发出这样的请求,第二条规则本身就不起作用了:

http://mydomain.tld/api/subscribers

这是不可能做到的干净。每个路由参数都需要某种值,当它出现在URL的末尾时可以为null,但不能出现在URL的中间。

尽管如此,有一个超级肮脏的解决方案:Route::get('{v}subscribers', 'APIRequestController@show')->where('v', '([0-9/]+)?');

现在你可以访问"yourdomain/api/1/subscribers"以及"yourdomain/api/subscribers",但要确保你的控制器中v参数的默认值。而且你已经剪掉了带有参数的斜杠。

最后:不要这样做,最好分开写两行,尽量保持代码干净,而不是这样做。