Cara mendapatkan parameter config di Templat Kerangka Symfony2

170

Saya memiliki templat Symfony2 Twig. Saya ingin menampilkan nilai parameter konfigurasi dalam template ranting ini (nomor versi). Karena itu saya mendefinisikan parameter config seperti ini:

parameters:
    app.version: 0.1.0

Saya dapat menggunakan parameter konfigurasi ini di Controllers tapi saya tidak tahu bagaimana cara mendapatkannya di templat Twig saya.

Timo Haberkern
sumber

Jawaban:

406

Anda bisa menggunakan substitusi parameter di bagian ranting global konfigurasi:

Konfigurasi parameter:

parameters:
    app.version: 0.1.0

Konfigurasi ranting:

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

Ranting template:

{{ version }}

Metode ini memberikan manfaat memungkinkan Anda untuk menggunakan parameter di ContainerAwarekelas juga, menggunakan:

$container->getParameter('app.version');
Ryall
sumber
Jawaban yang bagus. Tambahan: sejak Symfony 3.1, sebuah variabel harus dikutip: "% app.version%"
BigJ
@BigJ: Diperbarui untuk menyertakan kutipan, karena ini juga akan berfungsi dalam versi yang lebih lama.
Ryall
2
Ini seharusnya menjadi jawaban yang diterima. Terima kasih!
Cyrille
191

Dengan mudah, Anda dapat mendefinisikan dalam file konfigurasi Anda:

twig:
    globals:
        version: "0.1.0"

Dan akses dalam template Anda dengan

{{ version }}

Kalau tidak, harus dengan ekstensi Twig untuk mengekspos parameter Anda.

webda2l
sumber
28
Lebih baik mengaturnya dalam parameter seperti menjelaskan @Ryall.
MrGlass
89

Anda juga dapat memanfaatkan sistem Parameter Layanan bawaan, yang memungkinkan Anda mengisolasi atau menggunakan kembali nilai:

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

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

Sekarang, variabel ga_tracking tersedia di semua templat Twig:

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

Parameter ini juga tersedia di dalam pengontrol:

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

Anda juga dapat mendefinisikan layanan sebagai variabel ranting global (Symfony2.2 +):

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

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

Jika variabel global yang ingin Anda atur lebih rumit - katakan sebuah objek - maka Anda tidak akan dapat menggunakan metode di atas. Sebagai gantinya, Anda harus membuat Ekstensi Ranting dan mengembalikan variabel global sebagai salah satu entri dalam metode getGlobals.

Francesco Casula
sumber
5
Ini terlihat seperti solusi terbaik karena menjaga semua pengetahuan sistem bersama.
Jānis Gruzis
19

Pada versi yang lebih baru dari Symfony2 (menggunakan parameters.ymlbukan parameters.ini), Anda dapat menyimpan objek atau array bukan pasangan nilai kunci, sehingga Anda dapat mengelola global Anda dengan cara ini:

config.yml (diedit hanya sekali):

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

parameter.yml:

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

Dan kemudian dalam file ranting, Anda bisa menggunakan {{ project.version }}atau {{ project.name }}.

Catatan: Saya pribadi tidak suka menambahkan sesuatu app, hanya karena itu adalah variabel Symfony dan saya tidak tahu apa yang akan disimpan di sana di masa depan.

Alain Tiemblo
sumber
16

Ans yang diberikan di atas adalah benar dan berfungsi dengan baik. Saya menggunakan cara yang berbeda.

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%

Pengontrol di dalam:

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

Di dalam template / file ranting:

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

Untuk menggunakan output pengontrol:

Pengendali:

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

file templat / ranting:

Project version {{ app_version }}

Saya menyebutkan perbedaan untuk lebih memahami.

Sudhakar Krishnan
sumber
1
Ya bagus, jawaban ini sangat menjelaskan dua cara: melewati controller dan meneruskannya sebagai variabel ranting global! +1
Gottlieb Notschnabel
12

Dengan ekstensi Ranting, Anda dapat membuat parameterfungsi Ranting:

{{ 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
sumber
Terima kasih untuk ini, saya khawatir saya harus menduplikasi parameter dari file parameter ke ranting global.
Joe Yahchouchi
Bagus, tetapi itu bukan overload yang tidak perlu menarik seluruh kontainer ke ekstensi untuk satu parameter?
Lajdák Marek
Saya percaya dengan Symfony 2, Anda tidak dapat menyuntikkan parameter wadah (yang sekarang dimungkinkan dengan Symfony 4/5)
Thomas Decaux
1

Anda cukup mengikat $this->getParameter('app.version')pengontrol untuk memutar param dan kemudian merendernya.

Jean-Luc Barat
sumber
-3

Di confing.yml

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

Dalam tampilan Ranting

# twig view
{{ version }}
Le Petit Monde de Purexo
sumber
2
memberikan akses ke seluruh wadah layanan bukanlah ide yang baik. wadah itu adalah pelacak layanan dan bahkan tidak boleh disuntikkan dengan ketergantungan, jadi
jangan