【问题标题】:Laravel routing: how to prepend optional parameter in uri?Laravel 路由:如何在 uri 中添加可选参数?
【发布时间】:2017-03-24 07:02:40
【问题描述】:

实现 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/subscribers http://mydomain.tld/api/1/subscribers

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

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

但是,如果我尝试通过以下请求与您联系,则第二条规则本身将不起作用:

http://mydomain.tld/api/subscribers

【问题讨论】:

    标签: php rest laravel routing


    【解决方案1】:

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

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

    现在您可以访问“yourdomain/api/1/subscribers”以及“yourdomain/api/subscribers”,但请确保您的控制器中的 v 参数具有默认值。而且你还剪掉了参数附带的斜线。

    最后:不要这样做,最好写两行单独的代码并尽可能保持代码干净,而不是使用这种魔法。

    【讨论】:

    • 感谢您的确认,以及肮脏的解决方案:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多