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