为所有路由添加JSON路由以处理后端请求

时间:2015-07-29 09:47:52

标签: php laravel routing laravel-5 laravel-5.1

我正在使用Laravel 5.1并正在构建一个可以被视为JSON或HTML的服务。这种方法已经由像reddit这样的网站完成 示例
普通视图:http://www.reddit.com/r/soccer
JSON视图:http://www.reddit.com/r/soccer.json

如您所见,他们只需将.json添加到网址,用户就可以看到与HTML或JSON完全相同的内容。

我现在想在Laravel中重现相同的内容,但我有多个问题。

方法1 - 可选参数

我尝试的第一件事是为我的所有路线添加可选参数

Route::get('/{type?}', 'HomeController@index');
Route::get('pages/{type?}', 'PageController@index');

然而,我在这里遇到的问题是所有路由都被HomeController捕获,这意味着/pages/?type=json以及/pages?type=json被重定向到HomeController。

方法2 - 使用命名空间路由分组

接下来,我尝试添加带有命名空间的路由分组,以分隔后端和前端

Route::get('pages', 'PageController@index');
Route::group(['prefix' => 'json', 'namespace' => 'Backend'], function(){
    Route::get('pages', 'PageController@index');
});

然而,这也不起作用。当使用api作为前缀时,它确实有效,但我想要的是,我可以将.json添加到每个URL并将结果作为json获取。我怎样才能在Laravel中实现这一目标?

1 个答案:

答案 0 :(得分:1)

您可以在参数上应用正则表达式,以便像 HomeController @ index 那样抓住所有情况:

Route::get('/pages{type?}', 'PageController@index'->where('type', '\.json'));

这样类型只会匹配,如果它等于 .json

然后,要在您的控制器中访问它:

class PageController {
  public function index($type = null) {
    dd($type);
  }
}

然后转到 /pages.json