laravel / dingo API上的变压器使用

时间:2015-12-17 08:07:57

标签: php json rest laravel response

我正在创建一组REST API,使用laravel repository pattern暴露给我的移动应用程序。我使用dingo作为REST框架。我对如何使用变换器完成API的响应感到困惑。 / p>

我有以下控制器功能

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

My Tranformer课程

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,
...
        ];
    }
}

现在我的问题是,

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

2 个答案:

答案 0 :(得分:4)

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

演示者/变换器只不过是一个将数据从一个结构转换为另一个结构的层。当您想要确保您的API始终返回相同的结构时,无论基础数据对象是否发生更改,变换器层都非常有用。

因此,为了清楚起见,如果确实想要遵循存储库模式,那么正确的方法是让演示者返回变换器。但不要过于复杂化。

您可以使用任何想要转换的内容,也可以将数组转换为另一个数组,但是必须确保参数接受该数组。 例如:

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

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

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

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

答案 1 :(得分:0)

我已经检查了您的代码,请检查以下可能适合您的代码。您必须传递$session = Mage::getSingleton('customer/session'); if($session->getData('redirect_to_checkout')) { $session->unsetData('redirect_to_checkout'); Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/onepage')); } 而不转换为数组:

$user