【问题标题】:Eloquent model attributes as camel case [Laravel 5.2] [Dingo API]雄辩的模型属性作为骆驼案例 [Laravel 5.2] [Dingo API]
【发布时间】:2016-07-27 16:52:00
【问题描述】:

我们的 Eloquent 模型具有遵循 Laravel 蛇案例约定的属性。

例如first_namelast_namecreated_at

虽然我的前端 (react) 遵循 javascript 驼峰式大小写标准。

例如firstNamelastNamecreatedAt

在发送 API 响应时,有没有一种简单的方法可以将所有属性转换为驼峰式?

我们使用的是 Larave 5.2 和 Dingo API 包。


更新

继接受的答案之后,我使用了 自定义响应格式 方法。请参阅以下实现要点(包括单元测试):

https://gist.github.com/andrewmclagan/c5e0fe601d23f3b859b89a9f8922be68

【问题讨论】:

    标签: javascript php laravel reactjs dingo-api


    【解决方案1】:

    你真的有几个选择。我不会去实现它们(除非需要),但这里有一些我能想到的:

    在 Laravel 中:

    • 覆盖模型上的toArray() 方法。当模型转换为 JSON 时,它会调用 toArray()。您可以使用此方法遍历所有键并将其转换为驼峰式。不过,您需要在每个模型上重写它,但这可以通过父类或特征进行抽象。

    在野狗:

    • TransformersResponse Builder 一起使用。您可以为每个模型创建一个转换器,或者您可以为每个模型创建一个 CamelTransformerregister。您可以在转换器中将键转换为驼峰式。

    • 创建一个Custom Response Format。您可以创建扩展默认 json 格式的 camelJson 响应格式。用逻辑来覆盖必要的方法以驼峰式命名键。

    • 使用ResponseWasMorphed event。您可以为ResponseWasMorphed 事件创建一个事件处理程序,然后在其中检查并用驼峰式命名您的密钥。

    这些选项中的任何一个都应该能够完成这项工作,这只是您希望这些转换的全局性或细化程度的问题。例如,修改 toArray() 将影响将模型转换为数组(或 json)的所有代码,而不仅仅是响应代码,因此您可能不希望您的更改是全局的。

    我认为自定义响应格式可能是适合您的情况的最佳组合。

    【讨论】:

    • 正是我想要的,谢谢。在您的解释中,我还认为“自定义响应格式”是关键!谢谢!
    【解决方案2】:

    不要这样做。服务器不需要知道任何关于其客户端的信息。如果您的 React 应用程序需要处理驼峰式的属性,请将该任务委托给客户端。他们应该在所有请求通过的系统中都有点。那是客户端在收到响应后必须对其进行转换的正确位置。

    【讨论】:

      【解决方案3】:

      我通过以下方式解决了:

      在您的controller 班级中

      return response()->json($model);
      // => ['userName' => 'foo', 'userKey' => 'bar', ...]
      

      要求

      Laravel 5+

      安装

      $ composer require grohiro/laravel-camelcase-json:~1.0
      # Laravel 5.7+
      $ composer require grohiro/laravel-camelcase-json:~2.0
      

      添加服务提供者。

      config/app.php

      'provider' => [
          // default providers
          // ...
          
          Grohiro\LaravelCamelCaseJson\CamelCaseJsonResponseServiceProvider::class,
      ],
      

      参考:https://github.com/grohiro/laravel-camelcase-json

      【讨论】:

        猜你喜欢
        • 2017-09-03
        • 2016-04-19
        • 1970-01-01
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        • 2015-10-22
        • 2017-06-26
        相关资源
        最近更新 更多