user2496520
user2496520

Reputation: 921

Twig can't find function created inside TwigExtension class

I am trying to call Twig function created in TwigExtension (Symfony 3.3). Problem is that I can't find what I did wrong and I am not sure why it is not working

Does someone knows where is the problem?

This is error I am getting:

Unknown "getCurrentLocale" function.

Here is my code:

Twig Extension:

<?php

namespace AppBundle\Extension;

use Symfony\Component\HttpFoundation\Request;

class AppTwigExtensions extends \Twig_Extension
{
    protected $request;

    public function __construct(Request $request)
    {

        $this->request = $request;
    }

    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('getCurrentLocale', [$this, 'getCurrentLocale']),

        ];
    }

    public function getCurrentLocale()
    {
        dump ($this->request);
        /*
         * Some code
         */
        return "EN";

    }



    public function getName()
    {
        return 'App Twig Repository';
    }
}

Services:

services:

twig.extension:
    class: AppBundle\Extension\AppTwigExtensions
    arguments: ["@request"]
    tags:
      -  { name: twig.extension }

Twig:

{{ attribute(country.country, 'name' ~ getCurrentLocale() )  }}

Upvotes: 2

Views: 1627

Answers (1)

Jenne
Jenne

Reputation: 883

So what is your overall plan with the extension. Do you still need it when app.request.locale in twig returns the current locale? (which it does)

Also by default the @request service does not exist anymore.

In Symfony 3.0, we will fix the problem once and for all by removing the request service — from New in Symfony 2.4: The Request Stack

This is why you should get something like:

The service "twig.extension" has a dependency on a non-existent service "request".

So you made this service? Is it loaded? What is it? You can see all available services names matching request using bin/console debug:container request.

If you do need the request object in the extension, if you are planning to do more with you would want to inject the request_stack service together with $request = $requestStack->getCurrentRequest();.

Somehow the code, symfony version and the error message you posted don't correlate. Also in my test, once removing the service arguments it worked fine. Try it yourself reduce the footprint and keep it as simple as possible, which in my case was:

services.yml:

twig.extension:
    class: AppBundle\Extension\AppTwigExtensions
    tags:
        -  { name: twig.extension }

AppTwigExtensions.php:

namespace AppBundle\Extension;
class AppTwigExtensions extends \Twig_Extension {
    public function getFunctions() {
        return [
            new \Twig_SimpleFunction('getCurrentLocale', function () {
                return 'en';
            }),
        ];
    }
}

And take it from there, figure out when it goes wrong.

Upvotes: 1

Related Questions