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使用电子邮件和获取令牌登录用户