Cách nhận thông số cấu hình trong Symfony2 Twig Mẫu


170

Tôi có một mẫu Symfony2 Twig. Tôi muốn xuất giá trị của một tham số cấu hình trong mẫu twig này (số phiên bản). Vì vậy, tôi đã xác định tham số cấu hình như thế này:

parameters:
    app.version: 0.1.0

Tôi có thể sử dụng tham số cấu hình này trong Bộ điều khiển nhưng tôi không biết làm thế nào để lấy nó trong mẫu Twig của mình.

Câu trả lời:


406

Bạn có thể sử dụng thay thế tham số trong các twig toàn cầu của cấu hình:

Cấu hình tham số:

parameters:
    app.version: 0.1.0

Cấu hình cành:

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

Mẫu cành:

{{ version }}

Phương thức này cung cấp lợi ích cho phép bạn sử dụng tham số trong ContainerAwarecác lớp, bằng cách sử dụng:

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

Câu trả lời tốt. Phụ lục: kể từ Symfony 3.1, một biến phải được trích dẫn: "% app.version%"
BigJ

@BigJ: Được cập nhật để bao gồm các trích dẫn, vì điều này cũng sẽ hoạt động trong các phiên bản cũ hơn.
Ryall

2
Điều này chắc chắn nên là câu trả lời được chấp nhận. Cảm ơn !
Cyrille

191

Dễ dàng, bạn có thể xác định trong tệp cấu hình của mình:

twig:
    globals:
        version: "0.1.0"

Và truy cập nó trong mẫu của bạn với

{{ version }}

Nếu không, nó phải là một cách với tiện ích mở rộng Twig để hiển thị các tham số của bạn.


28
Tốt hơn là đặt nó trong các tham số như @Ryall giải thích.
MrGlass

89

Bạn cũng có thể tận dụng hệ thống Tham số dịch vụ tích hợp, cho phép bạn cách ly hoặc sử dụng lại giá trị:

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

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

Bây giờ, biến ga_tracking có sẵn trong tất cả các mẫu Twig:

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

Tham số này cũng có sẵn trong bộ điều khiển:

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

Bạn cũng có thể định nghĩa một dịch vụ là biến Twig toàn cầu (Symfony2.2 +):

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

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

Nếu biến toàn cục bạn muốn đặt phức tạp hơn - giả sử một đối tượng - thì bạn sẽ không thể sử dụng phương pháp trên. Thay vào đó, bạn sẽ cần tạo Tiện ích mở rộng Twig và trả về biến toàn cục dưới dạng một trong các mục trong phương thức getGlobals.


5
Đây có vẻ là giải pháp tốt nhất vì nó giữ tất cả kiến ​​thức về hệ thống.
Jāni Gruzis

19

Trên các phiên bản mới hơn của Symfony2 (sử dụng parameters.ymlthay thế parameters.ini), bạn có thể lưu trữ các đối tượng hoặc mảng thay vì các cặp khóa-giá trị, để bạn có thể quản lý toàn cầu theo cách này:

config.yml (chỉ chỉnh sửa một lần):

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

tham số.yml:

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

Và sau đó trong một tập tin twig, bạn có thể sử dụng {{ project.version }}hoặc {{ project.name }}.

Lưu ý: Cá nhân tôi không thích thêm mọi thứ vào app, chỉ vì đó là biến của Symfony và tôi không biết những gì sẽ được lưu trữ ở đó trong tương lai.


16

Các ans nêu trên là chính xác và hoạt động tốt. Tôi đã sử dụng theo một cách khác.

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%

Bộ điều khiển bên trong:

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

Bên trong tập tin mẫu / twig:

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

Để sử dụng đầu ra bộ điều khiển:

Điều khiển:

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

tập tin mẫu / twig:

Project version {{ app_version }}

Tôi đã đề cập khác nhau để hiểu rõ hơn.


1
Vâng, câu trả lời này giải thích rất rõ cả hai cách: chuyển qua bộ điều khiển và chuyển nó dưới dạng biến twig toàn cầu! +1
Gottlieb Notschnabel

12

Với tiện ích mở rộng Twig, bạn có thể tạo parameterchức năng 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';
    }
}

dịch vụ.yml:

  iz.twig.extension:
    class: IzBundle\Services\TwigExtension
    properties:
      container: "@service_container"
    tags:
      - { name: twig.extension }

Cảm ơn vì điều này, tôi đã lo lắng rằng tôi phải sao chép tham số từ tệp tham số sang twig global.
Joe Yahchouchi

Đẹp, nhưng nó không phải là một quá tải không cần thiết kéo toàn bộ container để mở rộng cho một tham số?
Lajdák Marek

Tôi tin với Symfony 2, bạn không thể tiêm các tham số trong thùng chứa (hiện có thể có với Symfony 4/5)
Thomas Decaux

1

Bạn có thể chỉ cần liên kết $this->getParameter('app.version')trong bộ điều khiển với twig param và sau đó kết xuất nó.


-3

Trong confing.yml

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

Trong chế độ xem Twig

# twig view
{{ version }}

2
cung cấp quyền truy cập vào toàn bộ container dịch vụ không phải là một ý tưởng tốt. container là một công cụ định vị dịch vụ và nó thậm chí không nên được tiêm bằng cách tiêm phụ thuộc, vì vậy không phải trong twig
Paul Andrieux
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.