Как получить параметры конфигурации в шаблонах веток Symfony2

170

У меня есть шаблон ветки Symfony2. Я хочу вывести значение параметра конфигурации в этом шаблоне ветки (номер версии). Поэтому я определил параметр config следующим образом:

parameters:
    app.version: 0.1.0

Я могу использовать этот параметр конфигурации в контроллерах, но понятия не имею, как получить его в моем шаблоне Twig.

Тимо Хаберкерн
источник

Ответы:

406

Вы можете использовать подстановку параметров в разделе глобалов веток конфигурации:

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

parameters:
    app.version: 0.1.0

Конфиг Twig:

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

Шаблон веточки:

{{ version }}

Этот метод дает преимущество, позволяя вам использовать параметр в ContainerAwareклассах, используя:

$container->getParameter('app.version');
Ryall
источник
Хороший ответ. Приложение: начиная с Symfony 3.1 переменная должна быть заключена в кавычки: "% app.version%"
BigJ
@BigJ: Обновлено, чтобы включить кавычки, так как это также будет работать в более старых версиях.
Ryall
2
Это определенно должен быть принятый ответ. Спасибо !
Сирил
191

Вы можете легко определить в своем конфигурационном файле:

twig:
    globals:
        version: "0.1.0"

И получить доступ к нему в вашем шаблоне с

{{ version }}

В противном случае это должен быть способ с расширением Twig для представления ваших параметров.

webda2l
источник
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%

parameters.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 }
Томас Деко
источник
Спасибо за это, я волновался, мне пришлось дублировать параметр из файла параметров в глобалы веток.
Джо Яхучи
Хорошо, но не является ли это ненужной перегрузкой вытягивания всего контейнера в расширение для одного параметра?
Лайдак Марек
Я полагаю, что с Symfony 2 нельзя вводить параметры контейнера (что теперь возможно с Symfony 4/5)
Томас Деко
1

Вы можете просто привязать $this->getParameter('app.version')в контроллере к параметру ветки и затем отобразить его.

Жан-Люк Барат
источник
-3

В confing.yml

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

В ветке зрения

# twig view
{{ version }}
Le Petit Monde de Purexo
источник
2
Предоставление доступа ко всему контейнеру службы не очень хорошая идея. контейнер является сервисным локатором, и его даже не нужно вводить с помощью инжекции зависимостей, так что ни в ветке
Paul Andrieux