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.
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.
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
.
Vous devez activer les annotations de la vue SensioFrameworkExtraBundle
sensio_framework_extra:
view: { annotations: false }
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