【问题标题】:How to change response in Laravel?如何更改 Laravel 中的响应?
【发布时间】:2017-02-19 10:03:44
【问题描述】:

我有端点可用的 RESTful 服务。

例如,我请求api/main并从服务器获取JSON数据。

对于我使用的响应:

return response()->json(["categories" => $categories]);

如何控制URL中响应传递参数的格式?

作为示例,我需要这个:api/main?format=json|html,它将适用于控制器中的每个 response

【问题讨论】:

  • 您将如何使用HTML 格式化响应?
  • 它应该返回View
  • 到目前为止你有什么尝试过的吗?
  • 我尝试了下面发布的代码
  • 你考虑过使用中间件吗?

标签: laravel laravel-5 laravel-5.4 laravel-response


【解决方案1】:

您可以使用此Response macros。例如在AppServiceProvider里面boot方法你可以添加:

\Response::macro('custom', function($view, $data) {
    if (\Request::input('format') == 'json') {
            return response()->json($data);
    }
    return view($view, $data);
});

现在您可以在控制器中使用:

$data = [
   'key' => 'value',
];

return response()->custom('your.view', $data);

如果您现在运行例如GET /categories,您将获得正常的HTML 页面,但如果您运行GET /categories?format=json,您将获得Json 响应。但是,根据您的需要,您可能需要对其进行更多自定义以处理例如重定向。

【讨论】:

    【解决方案2】:

    一种选择是为此使用Middleware。下面的示例假定您将始终返回 view('...', [/* some data */]),即带有数据的 视图

    当“格式”应该是json时,下面将返回传递给视图的数据数组,而不是编译后的视图本身。然后,您只需将此中间件应用于可以返回 jsonhtml 的路由。

    public function handle($request, Closure $next)
    {
        $response = $next($request);
    
        if ($request->input('format') === 'json') {
            $response->setContent(
                $response->getOriginalContent()->getData()
            );
        }
    
        return $response;
    }
    

    【讨论】:

      【解决方案3】:

      使用您的 format 查询参数示例,控制器代码将如下所示:

      public function main(Request $request)
      {
          $data = [
              'categories' => /* ... */
          ];
      
          if ($request->input('format') === 'json') {
              return response()->json(data);
          }
      
          return view('main', $data);
      }
      

      或者,您可以通过$request->input('format') === 'json'$request->ajax() 简单地检查传入请求是否是AJAX 调用

      【讨论】:

      • 问题是我不想在每个控制器中都写这段代码,我需要DRY原则。
      • 没有什么能阻止您将通用逻辑提取到辅助方法中。
      • 正如罗斯建议的那样,您可以从控制器返回$data 数组,并让自定义中间件处理转换为正确类型的响应。
      猜你喜欢
      • 2020-03-26
      • 2020-12-19
      • 2020-11-15
      • 2017-12-15
      • 1970-01-01
      • 2017-07-30
      • 2021-12-16
      • 1970-01-01
      • 2019-04-14
      相关资源
      最近更新 更多