Créez une API REST avec Symfony 3 : problème avec les version récentes ? view_response_listener mène à une erreur

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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

Édité par olganazo

+0 -0

Salut,

Le tuto est très bien fait, mais pourquoi ne pas se tourner vers api-platform ? C’est compatible SF4, c’est mis à jour, c’est recommandé par Sensio et surtout pour un besoin basique, un peu de config, quelques entités et l’API fonctionne.

+1 -0

Pas besoin, j’avais le même souci et je viens de le résoudre (sous sf4, mais je pense que ça fonctionne pour le 3) : Dans l’annotation @Rest\View, il faut rajouter l’option populateDefaultVars=false Le résultat sera :

1
2
3
4
5
    /**
     *
     * @Rest\View(populateDefaultVars=false)
     * @Rest\Get("/users")
     */

J’espère que ça fonctionnera pour toi

Édité par julien.tricard

+1 -0
Auteur du sujet

Julien un immense merci car ca marche enfin !

John, merci je ne connaissais pas API.plateform. Ca l’air très bien, j’ai fait quelques test, effectivement on arrive vite a un resultat. par contre je me sens moins à l’aise par rapport à des choses plus sophistiquées que je veux faire.

Je suis déjà partiellement nouvelle sur Symfony, avant je travaillais plutot sur ZEnd et en ce moment je suis plus sur du dev android alors ca fait beaucoup, je crois que je vais rester sur quelque chose qui je maitrise un peu et qui est assez documenté (je veux dire hors doc officiele).

Merci à tous les deux !

+0 -0

Salut,

C’est ce que je disais : api-platform est vraiment bien quand tu as un besoin basique, un peu de config, quelques entités, et le tour est joué. Quand le besoin est plus poussé, c’est bien aussi, mais ça nécessite du code en plus.

Bon courage à toi pour la suite. :)

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte