FOSRestBundle doesn't work in Symfony 4.1
Asked Answered
B

4

11

I have problem with returning views with FOSRestBundle working under Symfony 4.1 Project.

This is code from my controller:

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 }

So I have pretty basic configuration, and I am still getting errors like this:

(1/1) RuntimeException You must enable the SensioFrameworkExtraBundle view annotations to use the ViewResponseListener.

I tried to remove "view: view_response_listener: 'force'", but then I am having this error:

An instance of Symfony\Bundle\FrameworkBundle\Templating\EngineInterface >must be injected in FOS\RestBundle\View\ViewHandler to render templates.

I'am struggling with it for hours. Is it because of Symfony 4 beta status? Or maybe I am doing something wrong? Maybe I miss some dependecies? I couldn't find anything helpful about this problem in official documentation.

Bierce answered 27/11, 2017 at 13:37 Comment(2)
Might be related to this By the way, 4.1 would be the master development version. 4.0 is only in the release candidate stage.Transmit
And according to the bundle compatibility spreadsheet fosrestbundle does not yet support 4.x. Not a huge surprise.Transmit
S
18

Add line to config/packages/framework.yaml

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

it will solve

An instance of Symfony\Bundle\FrameworkBundle\Templating\EngineInterface >must be injected in FOS\RestBundle\View\ViewHandler to render templates.

Shiest answered 4/1, 2018 at 7:56 Comment(1)
It works, but what I don't understand, that I already use twig in my project. Why do I have to add in the generic framework-config when I want to use it in the ViewHandler?Weald
G
12

Do you send the Accept: application/json in your request?

If not, you do not necessarily need twig, but you need to remove html from the format configuration in the bundle config:

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

The default is to have html in the priorities, and that requires twig.

Gerstner answered 22/2, 2018 at 8:38 Comment(2)
Thanks! This solved the problem for me with Symfony 4.1.Woorali
This should be the correct answer! If you want to use json response for all routes, the rule {fallback_format: json} is just enough!Nephrolith
M
2

You must enable the SensioFrameworkExtraBundle view annotations

sensio_framework_extra:
    view:        { annotations: false }
Mukden answered 27/11, 2017 at 13:48 Comment(1)
Sorry, my mistake with copy pasting. It doesn't work for true and false value.Bierce
B
0

Templating component integration is deprecated in Symfony 4.3. So templating section must be removed (or commented) from config/packages/framework.yaml

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

To define Twig as templating service in ViewHandler add lines below to config/services.yaml

    fos_rest.templating:
        alias: twig
Bra answered 29/11, 2019 at 9:23 Comment(2)
How is this related to the question?Paviour
Alexander Matrosov suggest add templating line to config to resolve last error from question (i can not add comment answers now). But it is deprecated solution in Symfony 4.3.Bra

© 2022 - 2024 — McMap. All rights reserved.