Symfony2 Dal Şablonlarında yapılandırma parametreleri nasıl alınır


170

Bir Symfony2 Twig şablonum var. Bu dal şablonunda (sürüm numarası) bir config parametresinin değerini çıkarmak istiyorum. Bu nedenle config parametresini şöyle tanımladım:

parameters:
    app.version: 0.1.0

Bu yapılandırma parametresini Denetleyiciler'de kullanabiliyorum ama Twig şablonumda nasıl alacağımı bilmiyorum.

Yanıtlar:


406

Parametre ikamesini , yapılandırmanın dal genelleri bölümünde kullanabilirsiniz :

Parametre yapılandırması:

parameters:
    app.version: 0.1.0

Dal konfigürasyonu:

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

Dal şablonu:

{{ version }}

Bu yöntem, parametreyi ContainerAwaresınıflarda da kullanmanıza izin verme avantajını sağlar :

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

İyi cevap. Zeyilname: Symfony 3.1'den beri bir değişkenin alıntılanması gerekir: "% app.version%"
BigJ

@BigJ: Daha eski sürümlerde de çalışacağı için tırnak içerecek şekilde güncellendi.
Ryall

2
Bu kesinlikle kabul edilen cevap olmalıdır. Teşekkürler !
Cyrille

191

Kolayca, yapılandırma dosyanızda tanımlayabilirsiniz:

twig:
    globals:
        version: "0.1.0"

Ve şablonunuzdan

{{ version }}

Aksi takdirde, parametrelerinizi ortaya çıkarmak için bir Twig uzantısıyla bir yol olmalıdır.


28
@Ryall gibi parametrelerde ayarlamak daha iyi açıkladı.
MrGlass

89

Ayrıca, değeri izole etmenizi veya yeniden kullanmanızı sağlayan yerleşik Hizmet Parametreleri sisteminden de yararlanabilirsiniz:

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

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

Şimdi, ga_tracking değişkeni tüm Twig şablonlarında kullanılabilir:

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

Parametre ayrıca denetleyicilerin içinde de bulunur:

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

Bir hizmeti genel Dal değişkeni (Symfony2.2 +) olarak da tanımlayabilirsiniz:

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

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

Ayarlamak istediğiniz global değişken daha karmaşıksa - bir nesne söyleyin - yukarıdaki yöntemi kullanamazsınız. Bunun yerine, bir Twig Uzantısı oluşturmanız ve global değişkeni getGlobals yöntemindeki girdilerden biri olarak döndürmeniz gerekir.


5
Bu en iyi çözüme benziyor çünkü sistemin tüm bilgilerini bir arada tutuyor.
Jānis Gruzis

19

Symfony2'nin daha yeni sürümlerinde ( parameters.ymlyerine parameters.ini), anahtar / değer çiftleri yerine nesneleri veya dizileri depolayabilirsiniz, böylece globallerinizi bu şekilde yönetebilirsiniz:

config.yml (yalnızca bir kez düzenlenir):

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

parameters.yml:

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

Ve sonra bir dal dosyasında {{ project.version }}veya kullanabilirsiniz {{ project.name }}.

Not: Şahsen bir şeyler eklemekten hoşlanmıyorum app, çünkü bu Symfony'nin değişkeni ve gelecekte orada ne saklanacağını bilmiyorum.


16

Yukarıda verilen ans doğrudur ve iyi çalışır. Farklı bir şekilde kullandım.

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%

İç denetleyici:

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

İç şablon / dal dosyası:

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

Denetleyici çıkışını kullanmak için:

Denetleyici:

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

şablon / dal dosyası:

Project version {{ app_version }}

Daha iyi anlamak için farklı bahsettim.


1
Evet, bu cevap her iki yolu da çok iyi açıklıyor: kontrolörden geçmek ve küresel bir dal değişkeni olarak geçmek! +1
Gottlieb Notschnabel

12

Bir Twig uzantısıyla bir parameterTwig işlevi oluşturabilirsiniz :

{{ 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 }

Bunun için teşekkürler, parametre dosyasından dal globallerine parametre çoğaltmak zorunda kaldım.
Joe Yahchouchi

Güzel, ama gereksiz bir aşırı yük tüm parametre bir parametre için uzatma çekin değil mi?
Lajdák Marek

Symfony 2'ye inanıyorum, konteyner parametrelerini (şimdi Symfony 4/5 ile mümkün) enjekte edemezsiniz
Thomas Decaux

1

Sadece $this->getParameter('app.version')denetleyicide param dalına bağlanabilir ve daha sonra render edebilirsiniz.


-3

Confing.yml içinde

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

Dal görünümünde

# twig view
{{ version }}

2
tüm servis konteynerine erişim vermek iyi bir fikir değildir. konteyner bir servis bulucu ve hatta bağımlılık enjeksiyonu ile enjekte edilmemelidir, bu yüzden ne dalda
Paul Andrieux
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.