laravel/dingo API 上的变压器使用

Posted

技术标签:

【中文标题】laravel/dingo API 上的变压器使用【英文标题】:Transformer usage on laravel/dingo API 【发布时间】:2016-03-23 14:57:57 【问题描述】:

我正在创建一组 REST API,以便使用 laravel 存储库模式向我的移动应用程序公开。我使用 dingo 作为 REST 框架。我对如何使用转换器完成 API 的响应感到困惑。

我有以下控制器功能

if(!$user)  
    //Authenticate with Twitter and authenticate
    //Register user and issue jwt
    $user = Sentinel::register($device_details);
    $user_data = json_decode($user,true);
    $device_details['users_id'] = $user['users_id'] = $user_data['id'];
    $this->device_details->create($device_details);             

$token = JWTAuth::fromUser($user);
$user_array = $user->toArray();
$user_array['token'] = $token;   //An array containing user details and token
return $this->response->item($user_array, new UserTransformer)->setStatusCode(200);   //I can only pass an object (eloquent) as the #1 parameter

我的变形金刚课

namespace App\Api\V1\Transformers;

use App\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract 

    public function transform(User $user)
    
        return [
            'users_id'     => (int) $user->users_id,
            'AUTH-TOKEN'   => $user->token // Doesnt comes from database,
...
        ];
    

现在我的问题是,

    我只能使用带有变压器的雄辩对象吗? 在这种情况下,令牌是由 jwt 库生成的,我将它与数组绑定为单个用户数组。现在如何将这个数组传递给演示者。 分形转换器的文档没有说明将数组传递给演示者。我的数据可能并不总是来自一个雄辩的对象。 我该如何处理这种情况? 为什么要使用演示者?我会使用演示器或变压器,对吗?

【问题讨论】:

检查我的答案,它可能对你有用 【参考方案1】:

我猜你在这里混淆了几个概念。演示者与存储库模式相关联,我在您的示例代码中看不到任何相关内容,但我假设您正在使用它。

presenter/transformer 只不过是将数据从一个结构转换到另一个结构的层。如果您希望确保 API 始终返回相同的结构,而不管底层数据对象是否发生变化,则转换器层非常有用。

所以,为了清楚起见,如果您真的想要遵循存储库模式,正确的方法是让演示者返回一个转换器。但不要过于复杂。

你可以使用任何你想要转换的东西,你也可以将一个数组转换成另一个数组,但是你必须确保参数接受它。 例如:

public function transform(Array $user)
    return [
        'user_id'     => (int) $user['id'],
        'auth_token'  => $user['token']
    ];

我看到你正在使用 Dingo 并在 Laravel 5 中使用它。 因此,尝试将您的 dingo 响应修改为:

return $this->response->item($user, new UserTransformer);

还要确保 JWTAuth::fromUser($user); 可以读取 Sentinel 返回的 $user 对象/数组。

【讨论】:

感谢您提供的澄清。【参考方案2】:

我已检查您的代码,请检查以下可能对您有用的代码。您必须通过 $user 而不转换为数组:

if(!$user)  
             //Authenticate with Twitter and authenticate
            //Register user and issue jwt
            $user = Sentinel::register($device_details);
            $user_data = json_decode($user,true);
            $device_details['users_id'] = $user['users_id'] = $user_data['id'];
            $this->device_details->create($device_details);             
           
   $token = JWTAuth::fromUser($user);
   $user_array = $user->toArray();
   $user_array['token'] = $token;   //An array containing user details and token
    $user->token = $token;
   return $this->response->item(UserTransformer::transform($user))->setStatusCode(200);   //I can only pass an object (eloquent) as the #1 parameter

【讨论】:

即使我这样做了,我将如何传递我的 JWT 令牌?我将它转换为一个数组,以便我可以将我的令牌添加为数组中的索引之一,并将单个数组传递给变压器。 我有更新答案,您可以使用$user->token = $token;添加它 谢谢。让我测试一下。还有一个问题,转换器是否仅用于将雄辩的对象转换为可呈现的 json?只是用来抽象数据库层吗? 对不起,我不知道 你还可以做一件事:将token添加到$user_array后,重新转换为object

以上是关于laravel/dingo API 上的变压器使用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Dingo API 和中间件问题\\VerifyCsrfToken.php

php Laravel Dingo API JWT使用电子邮件和获取令牌登录用户

用laravel dingo/api创建简单的api

laravel dingo/api添加jwt-auth认证

Laravel Dingo Api - 如何从 API 控制器返回 JSON 格式的错误响应?

Laravel + Dingo + JWT + cors 和 OPTIONS 方法