Laravel:基于路由前缀的响应格式

时间:2016-05-23 10:17:07

标签: php laravel

我的Laravel应用程序(许多路线)中有一些路线

我想添加新功能,以JSON格式返回所有数据。现在数据只是视图。

/ ROUTE1 /选项 /路径2 /选项

我想拥有

/ JSON / ROUTE1 /选项 / JSON /路径2 /选项

所以,如果我现有的路由获得前缀/ json,则应该使用JSON返回数据。

我的路线看起来像Laravel中的正常路线

Route::get('user/{id}', function($id) {

    $user = ....
    return view('userprofile', $user);
});

如何更改此以了解请求json格式? 应该是单独的路由组,再次描述每条路由吗?

2 个答案:

答案 0 :(得分:0)

假设Laravel 5.2:

https://laravel.com/docs/5.2/routing#parameters-optional-parameters

Route::get('user/{id}/{format?}', function($id, $format = null) {

    $user = ....

    if($format == 'json') {
        return response()->json($user);
    }

    return view('userprofile', $user);
});

答案 1 :(得分:0)

在我看来,实现这一目标的最佳方法是让客户选择他们想要的东西。这通常使用Accept标头来实现。

GET myapp.com/user/1 HTTP/1.1
Accept application/json

在Laravel中编写应用程序时,此方法很好,因为如果通过Accept标头请求JSON,则始终会通知请求对象。

我在以下示例中使用了Laravel 5.2的隐式模型绑定。

Route::get('user/{user}', function(Request $request, User $user) {

    if ($request->wantsJson()) {
        return response()->json($user);
    }

    return view('userProfile', $user);
});

此方法可避免在网址中放入不必要的信息,从而保持API清洁。然而,许多下降的路由(包括我自己)是分离返回数据的路由和返回视图的路由。

Route::get('user/{user}', function(Request $request, User $user) {
    // Standard route, return a view
});

Route::get('api/user/{user}', function(Request $request, User $user) {
    // API route, always return JSON
});