Bonjour et bonne année à tous,
Bravo pour le tuto Créez une API REST avec Symfony 3 qui est vraiment super bien fait. Je l’avais suivi avec succès il y a un peu plus d’un an.
Ayant un nouveau besoin, je m’y suis remis et ca ne marche plus du tout. J’en suis au tout début, la mise en place du premier get marche bien tant que j’utilise la mécanique de vues de FosResBundle
1 2 3 4 5 6 7 8 9 10 11 12 13 | // Récupération du view handler $viewHandler = $this->get('fos_rest.view_handler'); // Création d'une vue FOSRestBundle $view = View::create($formatted); $view->setFormat('json'); // Gestion de la réponse return $viewHandler->handle($view); ` |
mais dès que je mets l’anotation pour la vue dès la première étape j’ai un plantage
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | <?php namespace App\Controller; use FOS\RestBundle\Controller\FOSRestController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use FOS\RestBundle\View\View; // Utilisation de la vue de FOSRestBundle use FOS\RestBundle\Controller\Annotations as Rest; // alias pour toutes les annotations use App\Entity\User; class UserController extends FOSRestController { /** * * @Rest\View * @Rest\Get("/users") */ public function getUsersAction(Request $request) { $users = $this->getDoctrine() ->getRepository(User::class) ->findAll(); /* @var $users User[] */ $formatted = []; foreach ($users as $user) { $formatted[] = [ 'id' => $user->getId(), 'firstname' => $user->getFirstname(), 'lastname' => $user->getLastname(), 'email' => $user->getEmail(), ]; } // Création d'une vue FOSRestBundle $view = View::create($formatted); $view->setFormat('json'); return $view; //return $users; } /** * @Rest\View() * @Rest\Get("/users/{id}") */ public function getUserAction(Request $request) { $user = $this->getDoctrine() ->getRepository(User::class) ->find($request->get('id')); /* @var $user User */ if (empty($user)) { return new JsonResponse(['message' => 'User not found'], Response::HTTP_NOT_FOUND); } $formatted = [ 'id' => $user->getId(), 'firstname' => $user->getFirstname(), 'lastname' => $user->getLastname(), 'email' => $user->getEmail(), ]; // Création d'une vue FOSRestBundle $view = View::create($formatted); $view->setFormat('json'); return $view; //return $user; } } |
1 2 3 4 5 6 7 8 9 10 11 | (1/1) ContextErrorException Warning: ReflectionObject::__construct() expects parameter 1 to be object, null given in ViewResponseListener.php (line 162) at ViewResponseListener->getDefaultVars(object(View), null, null)in ViewResponseListener.php (line 100) at ViewResponseListener->onKernelView(object(GetResponseForControllerResultEvent), 'kernel.view', object(ContainerAwareEventDispatcher))in EventDispatcher.php (line 212) at EventDispatcher->doDispatch(array(array(object(ViewResponseListener), 'onKernelView')), 'kernel.view', object(GetResponseForControllerResultEvent))in EventDispatcher.php (line 44) at EventDispatcher->dispatch('kernel.view', object(GetResponseForControllerResultEvent))in HttpKernel.php (line 156) at HttpKernel->handleRaw(object(Request), 1)in HttpKernel.php (line 68) at HttpKernel->handle(object(Request), 1, true)in Kernel.php (line 202) at Kernel->handle(object(Request))in index.php (line 37) |
Configuration des bundles
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | fos_rest: routing_loader: default_format: json view: default_engine: twig view_response_listener: 'force' formats: json: true xml: true templating_formats: html: true body_listener: true format_listener: rules: # instead of the the twig controller it can also be 'fos_rest.exception.controller:showAction' if the TwigBundle # is not enabled or a custom exception controller that you configured in fos_rest.exception.exception_controller - { path: ^/, fallback_format: json, attributes: { _controller: 'fos_rest.exception.twig_controller:showAction' } } - { path: ^/, fallback_format: html } service: view_handler: fos_rest.view_handler.default sensio_framework_extra: view: { annotations: true } router: { annotations: true } |
Ma configuration :
1 2 3 4 5 6 7 8 9 10 11 | Symfony 3.4.2 (kernel: src, env: dev, debug: true) doctrine/annotations v1.6.0 Docblock Annotations Parser friendsofsymfony/rest-bundle 2.3.0 This Bundle provides various... jms/serializer 1.10.0 Library for (de-)serializing... jms/serializer-bundle 2.3.1 Allows you to easily seriali... sensio/framework-extra-bundle v5.1.3 This bundle provides a way t... symfony/framework-bundle v3.4.2 Symfony FrameworkBundle symfony/routing v3.4.2 Symfony Routing Component twig/twig v2.4.4 Twig, the flexible, fast, an... ` |
Ca fait deux jours que je me casse la tete dessus. J’ai essayé toute sortes de choses et beaucoup de variantes de la configuration.
j’avais fait un premier test avec symfony 4 mais j’ai eu des problèmes bien avant cette étape et j’ai cru lire que FosRestBundle n’était pas compatible avec la V4 ce qui m’a poussé à travailler avec la v3.4.2
Merci d’avance pour votre aide.
Nat