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

时间:2016-03-28 13:42:46

标签: php symfony

我有档案parameters.yml

parameters:
    ............
    image_news_url: http://image.dev/news/

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

// 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';
}

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

2 个答案:

答案 0 :(得分:6)

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

$o_container = new ContainerBuilder();

这是错误的。

如果要访问容器,只需将容器注入扩展程序即可。

<强>配置

services:

    # [..]    

    your.twig_extension:
        class: Your\Namespace\YourExtension
        public: false
        arguments: [ "@service_container" ]
        tags:
            - { name: twig.extension }

班级

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');
    }

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

  • 仅注入参数本身%image_news_url%
  • 使用twig.globals配置指令

文档章节Using Service Container Parameters中有一个例子。

应用/配置/ parameters.yml

image_news_url: "http://some-url.tld"

app / config / config.yml

twig:
    globals:
       image_news_url: %image_news_url%

<强>模板

{{ image_news_url }}

答案 1 :(得分:0)

$o_container = new ContainerBuilder();

简单地声明ContainerBuilder的新实例不会授予您访问另一个(已存在的)实例的权限。您需要注入已存在的实例。而且 - 你实际上并不想要它,你只需要一个参数,所以你可以简单地注入它。

在您创建Twig扩展的服务定义中,您需要注入此参数。所以,你应该在services.xml文件中看到这样的内容......

    <service id="twig.extension.desktop_bundle" class="App\DesktopBundle\Twig\AppExtension" public="false">
        <argument>%image_news_url%</argument>
        <tag name="twig.extension" />
    </service>

然后,在Extension类中,您需要使用构造函数:

namespace App\DesktopBundle\Twig;

use Symfony\Component\DependencyInjection\ContainerBuilder;

class AppExtension extends \Twig_Extension
{
    private $url;
    public function __construct($url)
    {
        $this->url = $url;
    }
    // ...
}

现在,您可以在需要值的任何地方使用$this->url

阅读Dependency Injection以获取更多信息。