【问题标题】:Laravel: response format based on a a route prefixLaravel:基于路由前缀的响应格式
【发布时间】:2016-09-20 04:16:38
【问题描述】:

我的 Laravel 应用程序中有一些路由(很多路由)

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

/route1/选项 /route2/选项

我想拥有

/json/route1/options /json/route2/options

所以,如果我现有的任何路由都有前缀 /json ,那么数据应该用 JSON 返回。

我的路线看起来像 Laravel 中的普通路线

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

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

如何更改它以知道请求的是 json 格式? 它应该是单独的路由组,每条路由都被再次描述吗?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    在我看来,实现这一目标的最佳方式是让客户选择他们想要的。这通常使用 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);
    });
    

    此方法可避免在 url 中放置不必要的信息,从而保持 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
    });
    

    【讨论】:

      【解决方案2】:

      假设 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);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-19
        • 1970-01-01
        • 2018-07-07
        • 2016-03-26
        • 2019-09-07
        • 2013-01-05
        • 2022-11-16
        • 2020-05-17
        相关资源
        最近更新 更多