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.