Использование трансформатора в API laravel / dingo

Я создаю набор API-интерфейсов REST для доступа к моим мобильным приложениям с использованием шаблона репозитория 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 

Мой класс 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. Почему используются ведущие? Я бы либо использовал ведущего, либо трансформеру?

Я проверил ваш код. Пожалуйста, проверьте ниже код, который может сработать для вас. Вы должны передать $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 

Думаю, вы смешиваете пару концепций. Ведущий привязан к шаблону репозитория, я ничего не вижу в этом примере кода, но предполагаю, что вы его используете.

Презентатор / трансформатор – это не что иное, как слой, который передает данные из одной структуры в другую. Уровень трансформатора полезен, когда вы хотите убедиться, что ваш 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); может прочитать объект / массив $user который возвращает Sentinel.