Як отримати параметри конфігурації в шаблонах гілочок Symfony2


170

У мене є шаблон гілочки Symfony2. Я хочу вивести значення параметра config у цьому шаблоні гілочок (номер версії). Тому я визначив параметр config так:

parameters:
    app.version: 0.1.0

Я можу використовувати цей конфігураційний параметр у контролерах, але у мене немає поняття, як його отримати у своєму шаблоні Twig.

Відповіді:


406

Ви можете використовувати підстановку параметрів у розділі гілочок гілочок конфігурації:

Конфігурація параметра:

parameters:
    app.version: 0.1.0

Конфігурація гілочок:

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

Шаблон гілочки:

{{ version }}

Цей метод забезпечує перевагу, що дозволяє вам використовувати параметр і в ContainerAwareкласах, використовуючи:

$container->getParameter('app.version');

Хороша відповідь. Додавання: оскільки Symfony 3.1 змінну необхідно цитувати: "% app.version%"
BigJ

@BigJ: Оновлено, щоб включити котирування, оскільки це також працюватиме в старих версіях.
Райал

2
Це безумовно має бути прийнятою відповіддю. Дякую !
Кирила

191

Ви можете легко визначити у своєму конфігураційному файлі:

twig:
    globals:
        version: "0.1.0"

І отримати доступ до нього у своєму шаблоні за допомогою

{{ version }}

В іншому випадку це має бути способом із розширенням Twig викрити ваші параметри.


28
Краще встановити його в таких параметрах, як @Ryall пояснив.
MrGlass

89

Ви також можете скористатися вбудованою системою службових параметрів, яка дозволяє ізолювати або повторно використовувати значення:

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

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

Тепер змінна ga_tracking доступна у всіх шаблонах Twig:

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

Параметр також доступний всередині контролерів:

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

Ви також можете визначити послугу як глобальну змінну Twig (Symfony2.2 +):

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

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

Якщо глобальна змінна, яку ви хочете встановити, є більш складною - скажімо, об'єктом - тоді ви не зможете скористатися вищевказаним методом. Натомість вам потрібно створити розширення Twig та повернути глобальну змінну як одну із записів методу getGlobals.


5
Це виглядає як найкраще рішення, оскільки воно зберігає всі знання про систему разом.
Яніс Грузіс

19

У новіших версіях Symfony2 (використовуючи parameters.ymlзамість них parameters.ini) ви можете зберігати об'єкти або масиви замість пар ключових значень, щоб ви могли керувати глобалами таким чином:

config.yml (редагується лише один раз):

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

parametri.yml:

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

А потім у гілочному файлі ви можете використовувати {{ project.version }}або {{ project.name }}.

Примітка. Мені особисто не подобається додавати речі app, просто тому, що це змінна Symfony, і я не знаю, що буде зберігатися там у майбутньому.


16

Вище наведені анс є правильними і працює чудово. Я використовував по-іншому.

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%

Внутрішній контролер:

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

Файл шаблону / гілочки всередині:

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

Щоб використовувати вихід контролера:

Контролер:

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

файл шаблону / гілочки:

Project version {{ app_version }}

Я згадав різних, щоб краще зрозуміти.


1
Так добре, ця відповідь дуже добре пояснює обидва способи: проходження через контролер і передача його як глобальна змінна гілочка! +1
Готліб Ноцшнабель

12

За допомогою розширення Twig ви можете створити функцію 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 }

Дякую за це, я хвилювався, що мені довелося дублювати параметр з файлу параметрів у гілочки глобальних гілок.
Джо Яхчучі

Приємно, але це не зайве перевантаження тягнути весь контейнер до розширення для одного параметра?
Lajdák Marek

Я вважаю, що з Symfony 2 ви не можете вводити параметри контейнера (що зараз можливо із Symfony 4/5)
Thomas Decaux

1

Ви можете просто прив'язати $this->getParameter('app.version')контролер до гілочки парам і потім надати його.


-3

У confing.yml

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

У вигляді гілочки

# twig view
{{ version }}

2
надання доступу до всього контейнера послуг - не дуже гарна ідея. контейнер - це локатор обслуговування, і його навіть не слід вводити в ін'єкційну залежність, тому ні в гілочку
Пол Андріє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.