Synfony 4 + JMS Serializer - внутренняя ошибка сервера - PullRequest
0 голосов
/ 04 декабря 2018

У меня проблема с данными сериализации.

У меня есть две сущности, которые являются отношениями соединения.

Это мои сущности:

Task.php

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;

/**
 * @ORM\Entity
 */
class Task
{
    /**
     *
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     *
     */
    private $id;

    /**
     * @JMS\MaxDepth(1)
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="task")
     *
     */
    private $user;

User.php

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="app_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Task", mappedBy="user")
     */
    private $task;

    public function __construct()
    {

Я хотел бы создать API, и я сериализую свои данные с JMS.Я получаю эту ошибку:

Внутренняя ошибка сервера Сервер обнаружил внутреннюю ошибку или неверную конфигурацию и не смог выполнить ваш запрос.

Это мой контроллер:

public function getAllAction(): JsonResponse
    {
        $tasks = $this->taskService->getAll();
        $serializer = SerializerBuilder::create()->build();
        $data = $serializer->serialize($tasks, 'json', 
        SerializationContext::create()->enableMaxDepthChecks());

        return new JsonResponse($data, 200, [], true);
    }

Функция getAll в моем контроллере возвращает данные с таблицей Task.

Пожалуйста, помогите мне с моей проблемой.:)

Спасибо, друзья.

1 Ответ

0 голосов
/ 04 декабря 2018

Я не использовал JMS Serializer, но я могу предложить другое решение, например, компонент symfony serializer.

public function getAllAction(SerializerInterface $serializer): JsonResponse
{
    $data = $serializer->serialize($this->taskService->getAll(), 'json');
    return new JsonResponse($data, 200, [], true);
}

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

Для каждой сущностиатрибут, который вы хотите сериализовать, установите:

use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ORM\Column(name="title", type="string", nullable=false, length=150)
 * @Assert\Type("string")
 * @Assert\NotBlank()
 * @Groups({"group_name"})
 */
private $title;

/**
 * @ORM\Column(name="description", type="string", nullable=true, length=255)
 * @Assert\Type("string")
 */
private $description;

И затем вы сериализуете только это поле с определенной группой:

$serializer->serialize($this->taskService->getAll(), 'json', ['groups' => ['group_name']])

Doc: https://symfony.com/doc/4.1/serializer.html#using-serialization-groups-annotations

PS.Суффикс действия теперь не требуется https://symfony.com/doc/current/best_practices/controllers.html#controller-action-naming

...