Jak uzyskać parametry konfiguracyjne w Symfony2 Twig Templates

170

Mam szablon Twig Symfony2. Chcę wyprowadzić wartość parametru config w tym szablonie gałązki (numer wersji). Dlatego zdefiniowałem parametr config w ten sposób:

parameters:
    app.version: 0.1.0

Mogę użyć tego parametru konfiguracyjnego w kontrolerach, ale nie mam pojęcia, jak go uzyskać w moim szablonie Twig.

Timo Haberkern
źródło

Odpowiedzi:

406

Możesz użyć podstawiania parametrów w globalnych gałązkach konfiguracji:

Konfiguracja parametrów:

parameters:
    app.version: 0.1.0

Konfiguracja Twig:

twig:
    globals:
        version: '%app.version%'

Szablon gałązki:

{{ version }}

Ta metoda zapewnia tę korzyść, że pozwala na użycie parametru również w ContainerAwareklasach, używając:

$container->getParameter('app.version');
Ryall
źródło
Dobra odpowiedź. Dodatek: od Symfony 3.1 zmienna musi być cytowana: "% app.version%"
BigJ
@BigJ: Zaktualizowano, aby zawierał cytaty, ponieważ będzie to działać również w starszych wersjach.
Ryall
2
To zdecydowanie powinna być akceptowana odpowiedź. Dzięki !
Cyrille
191

Z łatwością możesz zdefiniować w swoim pliku konfiguracyjnym:

twig:
    globals:
        version: "0.1.0"

I uzyskaj do niego dostęp w swoim szablonie za pomocą

{{ version }}

W przeciwnym razie musi to być sposób z rozszerzeniem Twig, aby ujawnić parametry.

webda2l
źródło
28
Lepiej ustawić to w parametrach, takich jak wyjaśniono @Ryall.
MrGlass
89

Możesz także skorzystać z wbudowanego systemu Service Parameters, który umożliwia wyodrębnienie lub ponowne użycie wartości:

# app/config/parameters.yml
parameters:
    ga_tracking: UA-xxxxx-x

# app/config/config.yml
twig:
    globals:
        ga_tracking: "%ga_tracking%"

Teraz zmienna ga_tracking jest dostępna we wszystkich szablonach Twig:

<p>The google tracking code is: {{ ga_tracking }}</p>

Parametr jest również dostępny wewnątrz kontrolerów:

$this->container->getParameter('ga_tracking');

Możesz również zdefiniować usługę jako globalną zmienną Twig (Symfony2.2 +):

# app/config/config.yml
twig:
    # ...
    globals:
        user_management: "@acme_user.user_management"

http://symfony.com/doc/current/templating/global_variables.html

Jeśli zmienna globalna, którą chcesz ustawić, jest bardziej skomplikowana - powiedzmy obiekt - nie będziesz mógł użyć powyższej metody. Zamiast tego musisz utworzyć rozszerzenie Twig i zwrócić zmienną globalną jako jeden z wpisów w metodzie getGlobals.

Francesco Casula
źródło
5
To wygląda na najlepsze rozwiązanie, ponieważ zachowuje całą wiedzę o systemie razem.
Jānis Gruzis
19

W nowszych wersjach Symfony2 (używając parameters.ymlzamiast parameters.ini) możesz przechowywać obiekty lub tablice zamiast par klucz-wartość, więc możesz zarządzać swoimi globalnymi w ten sposób:

config.yml (edytowany tylko raz):

# app/config/config.yml
twig:
  globals:
    project: %project%

parameters.yml:

# app/config/parameters.yml
project:
  name:       myproject.com
  version:    1.1.42

A następnie w pliku gałązki możesz użyć {{ project.version }}lub{{ project.name }} .

Uwaga: Osobiście nie lubię dodawać rzeczy do app, tylko dlatego, że jest to zmienna Symfony i nie wiem, co będzie tam przechowywane w przyszłości.

Alain Tiemblo
źródło
16

Powyższe odpowiedzi są poprawne i działają poprawnie. Użyłem w inny sposób.

config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: app.yml }
    - { resource: app_twig.yml }

app.yml

parameters:
  app.version:           1.0.1

app_twig.yml

twig:
  globals:
    version: %app.version%

Kontroler wewnętrzny:

$application_version = $this->container->getParameter('app.version');
// Here using app.yml

Wewnątrz pliku szablonu / gałązki:

Project version {{ version }}!
{#  Here using app_twig.yml content.  #}
{#  Because in controller we used $application_version  #}

Aby użyć wyjścia kontrolera:

Kontroler:

public function indexAction() {
        $application_version = $this->container->getParameter('app.version');
        return array('app_version' => $application_version);
    }

plik szablonu / gałązki:

Project version {{ app_version }}

Wspomniałem o różnych dla lepszego zrozumienia.

Sudhakar Krishnan
źródło
1
Tak, fajnie, ta odpowiedź bardzo dobrze wyjaśnia oba sposoby: przechodzenie przez kontroler i przekazywanie go jako globalnej zmiennej gałązki! +1
Gottlieb Notschnabel
12

Dzięki rozszerzeniu Twig możesz utworzyć funkcję parameterTwig:

{{ parameter('jira_host') }}

TwigExtension.php:

class TwigExtension extends \Twig_Extension
{
    public $container;

    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('parameter', function($name)
            {
                return $this->container->getParameter($name);
            })
        ];
    }


    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'iz';
    }
}

service.yml:

  iz.twig.extension:
    class: IzBundle\Services\TwigExtension
    properties:
      container: "@service_container"
    tags:
      - { name: twig.extension }
Thomas Decaux
źródło
Dzięki za to, martwiłem się, że muszę zduplikować parametr z pliku parametrów do globals twig.
Joe Yahchouchi
Fajnie, ale czy to nie jest zbędne przeładowanie przeciągnięcia całego kontenera do rozszerzenia dla jednego parametru?
Lajdák Marek
Wierzę, że w Symfony 2 nie można wstrzykiwać parametrów kontenera (co jest teraz możliwe w Symfony 4/5)
Thomas Decaux
1

Możesz po prostu powiązać $this->getParameter('app.version')kontroler z paramem twig, a następnie wyrenderować go.

Jean-Luc Barat
źródło
-3

W confing.yml

# app/config/config.yml
twig:
  globals:
    version: '%app.version%'

W widoku Twig

# twig view
{{ version }}
Le Petit Monde de Purexo
źródło
2
udostępnianie całego kontenera usług nie jest dobrym pomysłem. kontener jest lokalizatorem usług i nie powinien być nawet wstrzykiwany pod kątem zależności, więc ani w twig
Paul Andrieux