Symfony2:如何在twig过滤器/扩展中从parameters.yml获取容器参数?

Har*_*cla 2 php symfony

我有档案parameters.yml:

parameters:
    ............
    image_news_url: http://image.dev/news/
Run Code Online (Sandbox Code Playgroud)

现在在我的包中我创建了一个新的枝条扩展:

// src/DesktopBundle/Twig/AppExtension.php

namespace App\DesktopBundle\Twig;

use Symfony\Component\DependencyInjection\ContainerBuilder;

class AppExtension extends \Twig_Extension
{
public function getFilters()
{
    return array(
        new \Twig_SimpleFilter('get_image', array($this, 'getImage')),
    );
}

public function getImage($domen, $image_id)
{
    $o_container = new ContainerBuilder();

    switch($domen){
        case 'news':
            return sprintf('%s%s',$o_container->getParameter('image_news_url'),$image_id.'.slide.jpg');
            break;
    }
}

public function getName()
{
    return 'app_extension';
}
Run Code Online (Sandbox Code Playgroud)

我有一个错误:You have requested a non-existent parameter "image_news_url.你能帮我吗 ?我不明白为什么我没有访问parameters.yml.Thx提前和抱歉我的英语

Nic*_*ich 7

问题是由您尝试自己构建容器引起的.

$o_container = new ContainerBuilder();
Run Code Online (Sandbox Code Playgroud)

这是错的.

如果要访问容器,只需将容器注入扩展中即可.

配置

services:

    # [..]    

    your.twig_extension:
        class: Your\Namespace\YourExtension
        public: false
        arguments: [ "@service_container" ]
        tags:
            - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)

use Symfony\Component\DependencyInjection\ContainerInterface;

namespace Your\Namespace;

class YourExtension 
{
    /** @var ContainerInterface */
    protected $container;

    /** @param ContainerInterface $container */
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    /** @return string */
    function getImage()
    {
        // some logic here

        return $this->container->getParameter('image_news_url');
    }
Run Code Online (Sandbox Code Playgroud)

我假设你想应用一些额外的逻辑来选择你的扩展中的参数.否则你可以简单地:

  • 只注入参数本身 %image_news_url%
  • 使用twig.globalsconfig指令

文档章节使用服务容器参数中有一个示例.

应用程序/配置/ parameters.yml

image_news_url: "http://some-url.tld"
Run Code Online (Sandbox Code Playgroud)

应用程序/配置/ config.yml

twig:
    globals:
       image_news_url: %image_news_url%
Run Code Online (Sandbox Code Playgroud)

模板

{{ image_news_url }}
Run Code Online (Sandbox Code Playgroud)