Удалите свойство _links из встроенных ресурсов в модуле zf-rest - PullRequest
0 голосов
/ 17 октября 2018

Я использую ZF2 с "zfcampus/zf-rest":"1.2.0" для возврата результатов API.

Для ресурса с именем Tag я получаю ответ ниже:

{
    "_links": {
        "self": {
            "href": "http://mydomain/article/tags"
        }
    },
    "_embedded": {
        "tags": [
            {
                "id": 1,
                "tag": "news",
                "isOfficial": true,
                "_links": {
                    "self": {
                        "href": "http://mydomain/article/tags"
                    }
                }
            }
        ]
    },
    "total_items": 1
}

Однако я хотел бы избавиться от свойства _links в ресурсе тегов, чтобы у меня был очистительвыход.

То, чего я хотел бы достичь, выглядело бы так:

{
    "_links": {
        "self": {
            "href": "http://mydomain/article/tags"
        }
    },
    "_embedded": {
        "tags": [
            {
                "id": 1,
                "tag": "news",
                "isOfficial": true
            }
        ]
    },
    "total_items": 1
}

Как мне добиться такого поведения?

Обратите внимание, что маршрутизатор для конечной точки реализован следующим образом:

'api.rest.article.tags' => [
                'type'    => 'Segment',
                'options' => [
                    'route'    => '/article/tags',
                    'defaults' => [
                        'controller' => 'Api\V1\ArticleTag\Controller',
                    ],
                ],
            ],

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

При использовании ZF Hal вы получите такой результат рендеринга, потому что собственные ссылки являются неотъемлемой частью стандарта Hal-Json, а ваш Tag считается ресурсом Hal и будет отображаться, как в вашем примере выше.Вы, вероятно, зарегистрировали метаданные и гидратор для этого класса, и они используются для извлечения сущности подобным образом.

Если вы не хотите отображать Tag как ресурс Hal, ваше решение может быть таким же простым, как удаление метаданных и гидратора для класса, и просто внедрение интерфейса JsonSerializable в ваш класс.и добавление метода jsonSerialize, который возвращает желаемый результат.Рендерер будет вызывать jsonSerialize во время рендеринга вместо этого ...

Когда не найден Hydrator и объект реализует этот интерфейс JsonSerializable, это запасной вариант для извлечения вашего объекта.

Вы можетепосмотрите, что здесь в методе extractEntity :

if ($hydrator) {
    return $hydrator->extract($entity);
}
if ($entity instanceof JsonSerializable) {
    return $entity->jsonSerialize();
}

Проверьте это сообщение в блоге на JsonSerializable: https://www.sitepoint.com/use-jsonserializable-interface/

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

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

ОБНОВЛЕНИЕ Комментарий от OP сделал этот ответ излишним.Оставить это, как это может помочь кому-то.Если вы используете полную Apigility, то это для вас.


Для одной версии V1.2. * Были выпущены в Июль 2016 , поэтому я бы предложил вам начатьс обновлением вашего приложения.

Кроме того, почему вы пытаетесь "почистить" это как бы?Удаление прямых ссылок для поиска отдельных объектов не имеет смысла при получении коллекции.


Вы делаете вызов "GET / tags" (Коллекция), но хотите получить один объект.

Чтобы получить один элемент, выполните "GET / tags"/: id "call, например" GET /tags/1".

Ответ одного элемента должен быть таким (может отличаться, используя для этого современную Apigility):

(обратите внимание, местный dev env, поэтому "http")

Одиночный вызов : "GET http://api.loc/coordinates/1"

{
    "latitude": "33.6062068",
    "longitude": "58.7053709",
    "id": 1,
    "_links": {
        "self": {
            "href": "http://api.loc/coordinates/1"
        }
    }
}

Сбор вызова : "GET http://api.loc/coordinates"

{
    "_links": {
        "self": {
            "href": "http://api.loc/coordinates?page=1"
        },
        "first": {
            "href": "http://api.loc/coordinates"
        },
        "last": {
            "href": "http://api.loc/coordinates?page=10"
        },
        "next": {
            "href": "http://api.loc/coordinates?page=2"
        }
    },
    "_embedded": {
        "coordinates": [
            {
                "latitude": "33.6062068",
                "longitude": "58.7053709",
                "id": 1,
                "_links": {
                    "self": {
                        "href": "http://api.loc/coordinates/1"
                    }
                }
            },
            {
                "latitude": "60.1948871",
                "longitude": "19.2423547",
                "id": 2,
                "_links": {
                    "self": {
                        "href": "http://api.loc/coordinates/2"
                    }
                }
            },
            { ... } another 247 results
        ]
    },
    "page_count": 10,
    "page_size": 25,
    "total_items": 249,
    "page": 1
}

Ссылки должны создаваться с использованием класса LinkExtractor, для которого вы можете использовать стратегии через конфигурацию.Если вы используете Apigility (который использует модуль zfcampus/zf-rest, который вы упомянули), вы можете применять такие стратегии:

[ ... ] // more config
'doctrine-hydrator' => [
    'Company\\V1\\Rest\\Company\\CompanyHydrator' => [
        'entity_class' => \Path\To\Company::class,
        'object_manager' => 'doctrine.entitymanager.orm_default',
        'by_value' => true,
        'strategies' => [
            'country' => \ZF\Doctrine\Hydrator\Strategy\EntityExtract::class,
            'currency' => \ZF\Doctrine\Hydrator\Strategy\EntityLink::class,
            'currencies' => \ZF\Doctrine\Hydrator\Strategy\CollectionExtract::class,
        ],
[ ... ] // more config

Они предоставлены ZF Doctrine Hydrator Тома Андерсона package.

Стратегии *Link предоставляют ссылки на объекты, ссылки, которые можно использовать, например, в вызовах GET.

Стратегии *Extract прямо гарантируют, что сущность гидратируется в результати вернулся вместо ссылки.


Как специально для удаления этого _links бита.Если вы используете zf-rest, потому что вы используете Apigility, и поэтому ссылки вызываются конфигурацией для zf-hal, тогда вы можете использовать опцию 'force_self_link' => false в конфигурации 'zf-hal' => [].Это должно быть сделано за набор.

См. эту страницу документации Apigility и найдите "force_self_link".

force_self_link - логическое значение;установить, должна ли автоматически создаваться ссылка на себя для объекта.По умолчанию true (так как рекомендуется).

Я бы согласился с документами: рекомендуется оставить это включенным.


ОБНОВЛЕНИЕ Комментарий от OP сделал этот ответ излишним.Оставить это, как это может помочь кому-то.

...