วิธีรับพารามิเตอร์การกำหนดค่าในแม่แบบ Symfony2 Twig


170

ฉันมีแม่แบบ Symfony2 Twig ฉันต้องการส่งออกค่าของพารามิเตอร์การกำหนดค่าในแม่แบบกิ่งไม้นี้ (หมายเลขรุ่น) ดังนั้นฉันจึงกำหนดพารามิเตอร์ config ดังนี้:

parameters:
    app.version: 0.1.0

ฉันสามารถใช้พารามิเตอร์การกำหนดค่านี้ในตัวควบคุม แต่ฉันไม่มีเงื่อนงำว่าจะรับมันในเทมเพลตทวิกของฉันได้อย่างไร

คำตอบ:


406

คุณสามารถใช้การทดแทนพารามิเตอร์ได้ในส่วนกิ่งคู่ของการกำหนดค่า:

การกำหนดค่าพารามิเตอร์:

parameters:
    app.version: 0.1.0

Twig config:

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

แม่แบบกิ่งไม้:

{{ version }}

วิธีนี้ให้ประโยชน์ของการอนุญาตให้คุณใช้พารามิเตอร์ในContainerAwareคลาสเช่นกันโดยใช้:

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

คำตอบที่ดี. ภาคผนวก: ตั้งแต่ Symfony 3.1 ตัวแปรจะต้องยกมา: "% app.version%"
BigJ

@BigJ: อัปเดตเพื่อรวมเครื่องหมายคำพูดเนื่องจากจะทำงานในเวอร์ชันที่เก่ากว่า
Ryall

2
นี่ควรเป็นคำตอบที่ยอมรับได้อย่างแน่นอน ขอบคุณมาก!
Cyrille

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 Extensionและส่งกลับตัวแปรโกลบอลเป็นหนึ่งในรายการในเมธอด getGlobals


5
ดูเหมือนว่าทางออกที่ดีที่สุดเพราะมันจะทำให้ความรู้ทั้งหมดของระบบเข้าด้วยกัน
Jānis Gruzis

19

ใน Symfony2 เวอร์ชั่นใหม่กว่า (ใช้parameters.ymlแทนparameters.ini) คุณสามารถจัดเก็บวัตถุหรืออาร์เรย์แทนคู่คีย์ - ค่าดังนั้นคุณสามารถจัดการ globals ของคุณได้ด้วยวิธีนี้:

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
Gottlieb Notschnabel

12

ด้วย Twig extension คุณสามารถสร้างparameterฟังก์ชั่น Twig:

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

ขอบคุณสำหรับสิ่งนี้ฉันกังวลว่าฉันต้องทำซ้ำพารามิเตอร์จากไฟล์พารามิเตอร์ไปยังทวิกกาล์ล
Joe Yahchouchi

เยี่ยมมาก แต่มันไม่ได้เป็นภาระเกินที่ไม่จำเป็นดึงทั้งคอนเทนเนอร์เพื่อขยายสำหรับหนึ่งพารามิเตอร์
Lajdák Marek

ฉันเชื่อกับ Symfony 2 คุณไม่สามารถฉีดพารามิเตอร์คอนเทนเนอร์ (ซึ่งตอนนี้เป็นไปได้กับ Symfony 4/5)
Thomas Decaux


-3

ใน confing.yml

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

ในมุมมองทวิก

# twig view
{{ version }}

2
การให้สิทธิ์เข้าถึงคอนเทนเนอร์บริการทั้งหมดไม่ใช่ความคิดที่ดี ภาชนะเป็นตัวระบุตำแหน่งของบริการและไม่ควรถูกฉีดด้วยการฉีดขึ้นรูปดังนั้นไม่ควรใช้กิ่งไม้
Paul Andrieux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.