我有档案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提前和抱歉我的英语
答案 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以获取更多信息。