web-dev-qa-db-fra.com

FOSRestBundle ne fonctionne pas dans Symfony 4.1

J'ai un problème avec le retour des vues avec FOSRestBundle fonctionnant sous le projet Symfony 4.1.

Voici le code de mon contrôleur:

class NewsController extends FOSRestController
{

    public function getNewsAction()
    {
        $data = ['news1', 'news2'];

        $view = $this->view($data, 200);

        return $this->handleView($view);
     }
}

fos_rest.yaml

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

framework.yaml

framework:
    secret: '%env(APP_SECRET)%'
    php_errors:
        log: true

sensio_framework_extra:
    view:        { annotations: true }

J'ai donc une configuration assez basique et je reçois toujours des erreurs comme celle-ci:

(1/1) RuntimeException Vous devez activer les annotations de vue SensioFrameworkExtraBundle pour utiliser ViewResponseListener.

J'ai essayé de supprimer "view: view_response_listener: 'force'", mais j'ai ensuite cette erreur:

Une instance de Symfony\Bundle\FrameworkBundle\Templating\EngineInterface> doit être injectée dans FOS\RestBundle\View\ViewHandler pour rendre les modèles.

Je lutte avec ça pendant des heures. Est-ce à cause du statut bêta de Symfony 4? Ou peut-être que je fais quelque chose de mal? Peut-être que je manque des dépendances? Je n'ai rien trouvé d'utile sur ce problème dans la documentation officielle.

10
jankes83

Ajouter une ligne à config/packages/framework.yaml

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

ça va résoudre

Une instance de Symfony\Bundle\FrameworkBundle\Templating\EngineInterface> doit être injectée dans FOS\RestBundle\View\ViewHandler pour rendre les modèles.

18
Alexander Matrosov

Envoyez-vous le Accept: application/json dans votre demande?

Sinon, vous n'avez pas nécessairement besoin de twig, mais vous devez supprimer html de la configuration du format dans la configuration du bundle:

fos_rest:
    format_listener:
        rules:
            - { path: ^/, prefer_extension: true, fallback_format: json, priorities: [ json ] }

La valeur par défaut est d'avoir html dans les priorités, ce qui nécessite twig.

10
magnetik

Vous devez activer les annotations de la vue SensioFrameworkExtraBundle

sensio_framework_extra:
    view:        { annotations: false }
2
Alister Bulman

L'intégration de composants de modèle est obsolète dans Symfony 4.3. Donc la section de modèles doit être supprimée (ou commentée) de config/packages/framework.yaml

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

Pour définir Twig comme service de modèle dans ViewHandler, ajoutez les lignes ci-dessous dans config/services.yaml

    fos_rest.templating: 
 alias: twig
0
Vitaliy