Интеграция FOSRestBundle с BazingaHateoasBundle, но ссылки все еще отсутствуют в ответе - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь интегрировать FOSRestBundle с BazingaHateoasBundle , но ссылки (которые я ожидал создать автоматически) все еще отсутствуют в ответе.Что не так с моей настройкой?

Вот мои конфиги:

composer.json [отрывок]:

"require": {
    "php": "^7.1.3",
    "friendsofsymfony/rest-bundle": "^2.5",
    "jms/serializer-bundle": "^2.4",
    "lexik/jwt-authentication-bundle": "^2.6",
    "sensio/framework-extra-bundle": "^5.2",
    "stof/doctrine-extensions-bundle": "^1.3",
    "symfony/flex": "^1.1",
    "symfony/framework-bundle": "4.2.*",
    "willdurand/hateoas-bundle": "^1.4"
},

jms_serializer.yaml:

jms_serializer:
    visitors:
        xml:
            format_output: '%kernel.debug%'

fos_rest.yaml:

fos_rest:
    zone:
        - { path: ^/api/* }
    view:
        view_response_listener:  true
    format_listener:
        rules:
            - { path: ^/api, prefer_extension: true, fallback_format: json, priorities: [ json ] }
    routing_loader:
        default_format: json
    body_listener:
        array_normalizer: fos_rest.normalizer.camel_keys
    serializer:
        serialize_null: true
    body_converter:
        enabled: true
        validate: true

А вот мои занятия:

PersonsController.php:

/**
 * @Rest\Route("/persons")
 */
class PersonsController extends AbstractFOSRestController
{
    /**
     * @Rest\Get("")
     * @return View
     */
    public function getList()
    {
        $repository = $this->getDoctrine()->getRepository(Person::class);

        $view = $this->view(
            $repository->findAll()
        );
        $view->getContext()->setGroups(['default']);

        return $view;
    }

}

Person.php

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Hateoas\Configuration\Annotation as Hateoas;
use JMS\Serializer\Annotation as Serializer;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity(repositoryClass="App\Repository\PersonRepository")
 * @UniqueEntity("slug")
 * @Serializer\ExclusionPolicy("all")
 * @Hateoas\Relation("self", href = "expr('/api/persons/' ~ object.getSlug())")
 */
class Person
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Serializer\Expose
     * @Serializer\Groups({"default"})
     */
    private $name;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     * @Gedmo\Slug(fields={"name"})
     * @Serializer\Expose
     * @Serializer\Groups({"default"})
     * @Serializer\XmlAttribute
     */
    private $slug;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getSlug()
    {
        return $this->slug;
    }

    public function setSlug($slug)
    {
        $this->slug = $slug;
        return $this;
    }

}

Тестирование:

GET http://localhost:8000/api/groups Ответ:

[
    {
        "name": "person1",
        "slug": "person1"
    },
    {
        "name": "person2",
        "slug": "person2"
    }
]

Ожидается:

[
    {
        "name": "person1",
        "slug": "person1",
        "_links": {
            "self": { "href": "http://example.com/api/persons/person1" }
        }
    },
    {
        "name": "person2",
        "slug": "person2",
        "_links": {
            "self": { "href": "http://example.com/api/persons/person2" }
        }
    }
]

Исследовано:

https://github.com/willdurand/BazingaHateoasBundle/blob/master/Resources/doc/index.md#serializing-objects - не показывает интеграцию с комплектом FOS.Он просто создает ответ вручную.

https://github.com/willdurand/Hateoas/issues/238 - предложено удалить serializedGroups, но мне нужны группы для правильного скрытия / отображения полей для отображения

Symfony и Wildurand / Hateoas Bundle - в JSON нет ссылокreposnse - OP только что вручную сконструировал объект ответа, поэтому фактически не использовал функции FOSRestBundle

https://symfony.com/doc/master/bundles/FOSRestBundle/1-setting_up_the_bundle.html#b-enable-a-serializer - поскольку JMSSerializerBundle является единственным сериализатором, который я установил, я предполагаю, чтоэто тот, который используется FOSRestBundle для автоматической сериализации данных.Поэтому я не должен вручную сериализовывать данные и составлять ответ, вопреки найденным решениям.

1 Ответ

0 голосов
/ 31 марта 2019

Мне просто нужно было добавить свойство exclusion к аннотации Relation и указать группу, в которой оно должно отображаться.

/**
 * @ORM\Entity(repositoryClass="App\Repository\PersonRepository")
 * @UniqueEntity("slug")
 * @Serializer\ExclusionPolicy("all")
 * @Hateoas\Relation(
 *   "self", 
 *   href = "expr('/api/persons/' ~ object.getSlug())",
 *   exclusion = @Hateoas\Exclusion(groups={"default"})
 * )
 */
class Person
{ ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...