FOSRestBundle горе с Symfony4, 204 нет ответа на контент - PullRequest
0 голосов
/ 29 мая 2018

Я сделал контроллер покоя для объектов Movie с действием get.

Мой менеджер баз данных один фильм с id:3.

enter image description here

Когда я пытаюсь получить доступ к localhost:8000/api/movie/3 или любой другой идее на этот счет, она сразу же возвращается к странице, с которой я пришел, только с намеком на отсутствие ответа на контент.

[Tue May 29 16:06:42 2018] 127.0.0.1:61540 [204]: /api/movie/3

Iиметь следующие конфигурации:

services.yaml

services:
    ...
    sensio_framework_extra.view.listener:
        alias: Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener
    ...

routs / rest.yaml

movies:
    type:     rest
    resource: App\Controller\MovieController
    prefix: /api

packages / fos_rest.yaml

fos_rest:
    param_fetcher_listener:  true
    allowed_methods_listener:  true
    routing_loader:
        include_format: false
    view:
        view_response_listener:  'force'
    format_listener:
        rules:
            - { path: '^/api', priorities: ['json'], fallback_format: 'json' }
    zone:
        - { path: ^/api/* }

packages / framework.yaml:

framework:
    ...
    templating: { engines: ['twig'] }

и следующие файлы:

Controller / MovieController.php

<?php

namespace App\Controller;

use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\RestBundle\Controller\FOSRestController;

/**
* @Rest\RouteResource("Movie", pluralize=false)
*/
class MovieController extends FOSRestController implements ClassResourceInterface {

    /**
     * @Rest\View()
     * @Rest\Get("/movie/{id}")
     */
    public function getAction(string $id) {}

}

Entity / Movie.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\MovieRepository")
 */
class Movie {
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=32)
     */
    private $title;

    public function __construct($title) {
        $this->title = $title;
    }

    ...
}

Отладочный маршрутизатор дает мне такой результат:

$ bin/console debug:router | grep movie
  get_movie                     GET        ANY      ANY    /api/movie/{id}

[обновление]

Из-за более ранних неправильных конфигураций я обнаружил ошибки:

1

Предупреждение: ReflectionObject :: __ construct () ожидает, что параметр 1 будет объектом, значение NULL

2

Экземпляр Symfony \ Bundle \ФрамeworkBundle \ Templating \ EngineInterface> должен быть вставлен в FOS \ RestBundle \ View \ ViewHandler для визуализации шаблонов.

3

Ошибка типа: аргумент 2 передан Twig_Environment ::render () должен иметь тип массива

4

Нет зарегистрированных путей для пространства имен "FOSRest".

5

SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 1 данных JSON

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

вы должны добавить populateDefaultVars в параметры аннотации вида, например:

/ ** * * @rest \ View (populateDefaultVars = false) * /

0 голосов
/ 29 мая 2018

Мне пришлось отредактировать MovieController для возвращения объекта или возврата исключения.

MovieController.php

<?php

namespace App\Controller;

use App\Repository\MovieRepository;
use Doctrine\ORM\EntityManagerInterface;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\RestBundle\Controller\FOSRestController;


/**
* @Rest\RouteResource("Movie", pluralize=false)
*/
class MovieController extends FOSRestController implements ClassResourceInterface {

    /**
     * @var EntityManagerInterface
     */
    private $entityManager;

    /**
     * @var MovieRepository
     */
    private $movieRepository;

    public function __construct(
        EntityManagerInterface $entityManager,
        MovieRepository $movieRepository
    ) {
        $this->entityManager       = $entityManager;
        $this->movieRepository     = $movieRepository;
    }

    public function getAction(string $id) {
        $movie = $this->movieRepository->find($id);

        if($movie === null) {
            throw new NotFoundHttpException();
        }

        return $this->view($movie);
    }
}
...