我正在使用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中实现这一目标?
答案 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