response () -> json () возвращает с переносом ресурсов - Laravel 5.6. * - PullRequest
0 голосов
/ 12 октября 2018

У меня проблема с ответом JSON моего API.Я использовал ресурс, так как я хотел ограничить, какие данные отправлять обратно клиенту.Раньше он правильно давал мой предполагаемый ответ, но когда я снова открыл свой проект, ответ изменился.

Вот части моего кода:

api.php

Route::get('admin/adminuserdetails/{adminUser}', 'AdminsController@AdminUserDetails');

Пример URL: http://localhost:8000/api/admin/adminuserdetails/1

Контроллер

public function AdminUserDetails(AdminUsers $adminUser){
    return response()->json(new AdminUserAccessDetails($adminUser), 200);
}

Модель AdminUsers

class AdminUsers extends Model
{

//
   protected $table = 'AdminUsers';
   protected $primaryKey = 'AdminUserId';
   protected $guarded = [];
}

Ресурс AdminUserAccessDetails

class AdminUserAccessDetails extends JsonResource
{
    public function toArray($request)
    {
        //return parent::toArray($request);
        return [
        'adminUserId' => $this->AdminUserId,
        'adminFirstName' => $this->AdminFirstName,
        'adminLastName' => $this->AdminLastName,
        'modulesAllowed' => $this->ModulesAllowed,
        'actionsAllowed' => $this->ActionsAllowed
        ];
    }
}

Образец ответа (раньше мой предполагаемый ответ)

{
    "adminUserId": 1,
    "adminFirstName": "asdfasdf",
    "adminLastName": "asdfsadf",
    "modulesAllowed": "",
    "actionsAllowed": ""
}

Образец ответа (сейчас)

{
        {
        "resource": {
            "adminUserId": 1,
            "adminFirstName": "asdfasdf",
            "adminLastName": "asdfsadf",
            "adminEmail": "asdfsadf@fsafsa.com",
            "adminPassword": "l6wfDtAaYAp6aM04TU++9A==",
            "authToken": "68bbc9fc7eb08c9f6d96f6b63d30f056",
            "fCMToken": null,
            "profileImage": "https://www.gravatar.com/avatar/5d0d65256e8c2b15a8d00e8b208565f1?d=identicon&s=512",
            "userTypeId": "0",
            "status": "A",
            "createDate": "2018-06-26 16:01:43.947",
            "updateDate": "2018-06-26 16:01:44.143",
            "modulesAllowed": "",
            "actionsAllowed": ""
        },
        "with": [],
        "additional": []
    }

Iничего не изменилось, но когда я протестировал это снова (не только на этом конкретном маршруте), все, что использует какой-либо ресурс, теперь заключено в оболочку этого ресурса, и я не могу найти причину.

Я пытался реализовать ту же логику с другим чистым проектом, и он отлично работает.

Что является причиной этого и как я могу получить обратно мой намеченный ответ?

Редактировать 1: Я попытался изменить свой возврат, я удалил код «response () -> json ()», чтобы мой контроллер выглядел так:

public function AdminUserDetails(AdminUsers $adminUser){
        //return response()->json(new AdminUserAccessDetails($adminUser), 200);
        return new AdminUserAccessDetails($adminUser);
    }

Ответ этого редактирования теперь немногоближе к моему предполагаемому выводу:

{
    "data": {
        "adminUserId": 1,
        "adminFirstName": "asdfasdf",
        "adminLastName": "asdfsadf",
        "modulesAllowed": "",
        "actionsAllowed": ""
    }
}

Однако я все еще предпочитаю использовать response () -> json (), чтобы я мог вернуть правильный код ответа HTTP ..

1 Ответ

0 голосов
/ 12 октября 2018

Я думаю, что проблема в том, что вы отправляете объект Laravel как ответ API.Помните, объект экземпляра Laravel Core добавляет некоторые свойства / методы для легкого управления / использования внутри вашего кода.

Я могу порекомендовать вам создать новый класс или ассоциативный массив для инкапсуляции специфических свойств, а затем отправить его.

Например:

public function AdminUserDetails(AdminUsers $adminUser){

    // Example with Object
    $Object = new YourClass(); // you can define with yours wished properties
    $Object->PropertyA = $adminUser->Property1;
    $Object->PropertyB = $adminUser->Property2;
    // ...

    return response()->json($Object, 200);

    // Example with Associative Array
    $AssociateArray = array(
        "PropertyA" => $adminUser->Property1,
        "PropertyB" => $adminUser->Property2,
        // ...
    );

    return response()->json($AssociateArray, 200);

}

Надеюсь, будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...