Eloquent模型属性为骆驼大小写[Laravel 5.2][Dingo API]

Eloquent model attributes as camel case [Laravel 5.2] [Dingo API]

本文关键字:Laravel API Dingo 大小写 属性 模型 Eloquent      更新时间:2024-02-03

我们的Eloquent模型具有遵循Laravel snake case约定的属性。

例如first_namelast_namecreated_at

尽管我的前端(react)遵循javascript camel-case标准。

例如firstNamelastNamecreatedAt

在发送API响应时,是否有一种简单的方法可以将所有属性转换为骆驼大小写?

我们正在使用Larave 5.2和Dingo API软件包


更新

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

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

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

在Laravel:

  • 覆盖模型上的toArray()方法。当一个模型被转换为JSON时,它会调用toArray()。您可以使用此方法来遍历并将所有密钥转换为camelCase。不过,您需要在每个模型上覆盖它,但这可以通过父类或特性进行抽象

在Dingo:

  • 将Transformers与响应生成器一起使用。您可以为每个模型创建一个转换器,也可以创建一个CamelTransformer并将其注册到每个模型中。您可以在转换器中将关键帧转换为camelBase。

  • 创建自定义响应格式。您可以创建一个扩展默认json格式的camelJson响应格式。用camelCase键的逻辑覆盖必要的方法。

  • 使用ResponseWasMorphed事件。您可以为ResponseWasMorphed事件创建一个事件处理程序,并在其中遍历和camelCase键。

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

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

不要这样做。服务器不需要了解其客户端的任何信息。如果您的React应用程序需要处理camel情况下的属性,请将该任务委托给客户端。它们应该在系统中具有所有请求通过的点。这是客户端在收到响应后必须对其进行转换的正确位置。

我通过以下方式解决:

在您的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