Laravel - 仅为方便起见修改API数据

时间:2017-03-25 17:37:21

标签: javascript php json laravel api

让我们假设以下数据完全返回,就像它存储在数据库中一样:

[
    {
        "user_name": "User 1",
        "photo_file": "user1.jpg"
    },
    {
        "user_name": "User 2",
        "photo_file": "user2.jpg"
    }
    // ...
]

我想在JavaScript应用程序中使用这些数据,但我想附加用户照片的完整路径,比如在将数据返回API之前对数据进行处理。我怎么能用Laravel做到这一点?

3 个答案:

答案 0 :(得分:1)

Accessors对此有好处。

假设您的数据存储在名为Customer的模型中。我会写一个这样的访问器:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Customer extends Model
{

    protected $appends = ['photo_file']; // In order to see the new attribute in json dumps

    public function getPhotoPathAttribute()
    {
        $name = $this->getAttribute('photo_file');

        if(!isset($name))
            return null;

        return '/full/path/to/image/' . $name;
    }
}

这样你现在可以调用$customer->photo_path并返回`/full/path/to/image/image_name.jpg'(如果没有设置属性,则为null)。

修改

为了在jsons中显示此属性(不专门调用$model->photo_path),您还需要将protected $appends = ['photo_file']添加到模型中(更新)。

我建议不要覆盖原始名称(因此我保持photo_file属性不变)。

答案 1 :(得分:1)

我假设您目前只是将查询结果转换为JSON并返回。这有效,但它确实意味着响应与您的数据库结构紧密耦合,这是一个坏主意。理想情况下,你应该有一层抽象来处理数据的添加和格式化,有点像MVC中的视图层。

有很多解决方案。我使用Fractal作为我的Laravel API。它允许您通过指定将为您呈现该对象的转换器轻松自定义特定端点的输出。这样,您就可以轻松选择要显示的数据并按照您的意愿进行格式化。

答案 2 :(得分:1)

如果您正在构建Laravel API,请确保Matthew说,请检查Fractal。但不要忘记Dingo,这是在Laravel上构建API的最佳工具。它也使用Fractal。