【问题标题】:Nested Transformer Laravel 5 return "dirty json"嵌套变压器 Laravel 5 返回“脏 json”
【发布时间】:2015-05-28 18:53:57
【问题描述】:

在我的 Laravel 5 应用程序中,我使用了 Fractal 和 Transformers。在一个响应中,我嵌套了两个使用 Trasnformers 转换的对象。

这是我的代码:

public function transform(UserLogin $userLogin)
{
    $fractal = new Manager();
    $fractal->setSerializer(new ArraySerializer());
    $user = new Item($userLogin->user, new UserTransformer);
    return [
        "token" => $userLogin->token,
        "user" => $fractal->createData($user)->toJson()
    ];
}

这是用户转换器转换:

public function transform(User $user)
{
    return [
        'id'=> $user->id,
        'name' => $user->firstname." ".$user->lastname,
        'email' => $user->email,
    ];
}

在我的控制器中,我这样返回:

return Fractal::item($userLogin, new UserLoginTransformer)->responseJson(200);

这是来自服务器的响应:

 {
  "token": "the_token_generated",
  "user": "{\\\"id\\\":1,\\\"name\\\":\\\"Name\\\",\\\"email\\\":\\\"myemail@myemail.com\\\"}"
}

显示所有这些斜线我有什么问题?

【问题讨论】:

    标签: php json laravel


    【解决方案1】:

    您正在编码两次:

    return [
        "token" => $userLogin->token,
        "user" => $fractal->createData($user)->toJson()
    ];
    

    请注意,user 键包含一个 json 字符串,因为您已使用 toJson() 对其进行编码。

    现在,当您对最终结果进行编码时,您将对该 json 字符串进行编码,然后生成该字符串:

    "{\\\"id\\\":1,\\\"name\\\":\\\"Name\\\",\\\"email\\\":\\\"myemail@myemail.com\\\"}"
    

    你不应该编码部分结果,只编码最终结果:

    return [
        "token" => $userLogin->token,
        "user" => $fractal->createData($user)
    ];
    

    编辑:根据您的评论,您需要:

    return [
        "token" => $userLogin->token,
        "user" => $fractal->createData($user)->toArray()
    ];
    

    【讨论】:

    • 它返回 {} 并且 "user" 键中没有数据
    • @Bellots createData() 方法返回什么?也许您需要类似toObject() 而不是toJson() 来返回实际信息。
    • Fractal的方法,只接受toJson()或toArray()
    • @Bellots toArray() 然后:-)
    • 我认为 toArray() 只是为了收集,它有效:) 谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多