Rest API - почему почтальон отправляет мне пустые фигурные скобки с GET - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над REST API.Следовательно, я создал свои сущности, например, например, этот musee.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Musee
 *
 * @ORM\Table(name="musee")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\MuseeRepository")
 */
class Musee
{
/**
 * @var int
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(type="string", nullable=false)
 */
private $nom;

/**
 * @var string
 *
 * @ORM\Column(type="string", nullable=false)
 */
private$adresse;

/**
 * @var integer
 *
 * @ORM\Column(type="integer", nullable=false)
 */
private $horaireOuverture;

/**
 * @var integer
 *
 * @ORM\Column(type="integer", nullable=false)
 */
private $horaireFermeture;


/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Bateau", mappedBy="musee")
 * @ORM\JoinColumn(referencedColumnName="id")
 */
private $bateaux;

/**
 * @return int
 */
public function getId()
{
    return $this->id;
}

/**
 * @param int $id
 */
public function setId($id)
{
    $this->id = $id;
}

/**
 * @return string
 */
public function getNom()
{
    return $this->nom;
}

/**
 * @param string $nom
 */
public function setNom($nom)
{
    $this->nom = $nom;
}

/**
 * @return string
 */
public function getAdresse()
{
    return $this->adresse;
}

/**
 * @param string $adresse
 */
public function setAdresse($adresse)
{
    $this->adresse = $adresse;
}

/**
 * @return int
 */
public function getHoraireOuverture()
{
    return $this->horaireOuverture;
}

/**
 * @param int $horaireOuverture
 */
public function setHoraireOuverture($horaireOuverture)
{
    $this->horaireOuverture = $horaireOuverture;
}

/**
 * @return int
 */
public function getHoraireFermeture()
{
    return $this->horaireFermeture;
}

/**
 * @param int $horaireFermeture
 */
public function setHoraireFermeture($horaireFermeture)
{
    $this->horaireFermeture = $horaireFermeture;
}

/**
 * @return mixed
 */
public function getBateaux()
{
    return $this->bateaux;
}

/**
 * @param mixed $bateaux
 */
public function setBateaux($bateaux)
{
    $this->bateaux = $bateaux;
}


}

Мой MuseeRepository также существует, и в моем config.yml я вставил (оба были установлены с помощью composer):

# Nelmio CORS
nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin: ['*']
        allow_headers: ['Content-Type']
        allow_methods: ['POST', 'PATCH', 'GET', 'DELETE', 'OPTIONS']
        max_age: 3600
    paths:
        '^/api':

# FosRest
fos_rest:
routing_loader:
    include_format: false
view:
    view_response_listener: true
format_listener:
    rules:
        - { path: '^/', priorities: ['json'], fallback_format: 'json' }

В моем MuseeController вот что я положил:

<?php
/**
 * Created by PhpStorm.
 * User: Fanny
 * Date: 28/03/2018
 * Time: 16:13
*/

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\View\View;
use AppBundle\Entity\Musee;

class MuseeController extends Controller
{
    /**
     * @Rest\View(serializerGroups={"musee"})
     * @Rest\Get("/musee")
    */

   // Fonction qui renvoie toutes all musee
    public function findMusee()
   {
        $musee = $this->getDoctrine()
        ->getRepository('AppBundle:Musee')
        ->findAll();

    return $musee;
}


}

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

AppBundle\Entity\Musee:
  attributes:
    id:
      groups: ['musee']
    nom:
      groups: ['musee']
    adresse:
      groups: ['musee']
    horaire_ouverture:
      groups: ['musee']
    horaire_fermeture:
      groups: ['musee']
    bateaux:
      groups: ['musee']

Моя проблема в том, что когда я пытаюсь позвонить своему локальному хосту: 8000 / musee, я получаю достаточное количество скобок по сравнению с тем, что находится в моей базе данных, но они кажутся пустыми.

Я думаю, что я мог пропустить шаг, но я не уверен, где искать.Как вы думаете, куда мне смотреть?

ОБНОВЛЕНИЕ:

Версия Symfony, которую я имею, - 3.4.Я включил сериализатор в моем config.yml и установил с помощью composer: jms / serializer-bundle.В моем приложении Kernel у меня есть:

 new FOS\RestBundle\FOSRestBundle(),
 new JMS\SerializerBundle\JMSSerializerBundle(),
 new Nelmio\CorsBundle\NelmioCorsBundle(),

Проблема общая для всех моих сущностей.Я получаю правильное количество скобок, но нет содержимого внутри.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Это происходит потому, что вы возвращаете массив сущностей вместо действительного ответа json.Я тоже работаю в REST / API, но без FOSRest, поэтому я не могу быть полностью уверен, как происходит сериализация с FOSREST, но определенно так.Обходным путем может быть возвращение JSONResponse в вашем контроллере, когда все ваши сущности каким-то образом сериализуются, вместо того, чтобы возвращать массив сущностей, как вы сейчас делаете здесь

return $musee;
0 голосов
/ 26 апреля 2018

Я воссоздал свой проект и на этот раз не получил ошибку ... Я не уверен, в чем причина, но я использовал те же версии и команды Symfony. Так что, возможно, где-то возникла проблема, даже если я попытаюсь сравнить оба и не увижу никакой разницы. Я постараюсь сказать вам, если найду это.

0 голосов
/ 25 апреля 2018
Документы

FOSRestBundle охватывают сериализацию здесь: Включить сериализатор

Но в настоящее время CSS, похоже, разваливается, поэтому я процитирую его:

C) Включить сериализатор

Для правильной работы этого комплекта требуется сериализатор.В большинстве случаев вам нужно включить сериализатор или установить его.Этот пакет пытается выполнить следующее (в указанном порядке) для определения используемого сериализатора:

  1. Тот, который вы сконфигурировали с помощью fos_rest.services.serializer (если вы это сделали).
  2. Сериализатор JMS, если JMSSerializerBundle равно доступно (и зарегистрировано).
  3. Symfony Serializer, если включено (или любая служба, называемая сериализатором).

Вопросы:

  1. Какую версию Symfony вы используете?
  2. Включен ли компонент Serializer?
  3. проблема ограничена Musee или всеми объектами?

Пожалуйста, обновите вопрос с ними, и мы сможем ответить.

Обновление:

Не могу помочьно интересно, имеет ли это отношение к тому, что все службы становятся частными в Symfony 3.4.Возможно FOSRestBundle не может найти JMSSerializerBundle.Какую версию FOSRestBundle вы установили?

Я вижу, что во всех выпущенных версиях FOSRestBundle указано требование зависимости ^3.0, но приведенное выше относится только к v3.4.

...