我收到以下错误,
[Twig_Error_Runtime]
An exception has been thrown during the rendering of a template ("You cannot create a service ("templating.helper.assets") of an inactive scope ("request").") in "AcmeMessagingBundle:Comment:email.html.twig".
我正在使用symfony 2自定义控制台命令
渲染twig模板下面是我的服务类,它是事件订阅者,我通过symfony console命令触发onCommentAddEmail事件来发送电子邮件,
class NotificationSubscriber implements EventSubscriberInterface
{
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public static function getSubscribedEvents()
{
return array(
'comment.add' => array('onCommentAddEmail', 0),
);
}
public function onCommentAddEmail(CommentAddEvent $event)
{
...................
$body = $this->container->get('templating')->render(
'AcmeMessagingBundle:Comment:email.html.twig',
array('template' => $template)
);
.......
}
}
$ body传递给swiftmailer发送电子邮件。
这是我的服务定义,
ACME \ MessagingBundle \用户\ NotificationSubscriber
<services>
<service id="notification_subscriber" class="%notification_subscriber.class%">
<argument type="service" id="service_container" />
<tag name="kernel.event_subscriber" />
</service>
</services>
下面的帖子说问题已在symfony 2.1中修复,但我仍然收到错误,
https://github.com/symfony/symfony/issues/4514
我已经审阅了http://symfony.com/doc/current/cookbook/service_container/scopes.html,我已将整个容器传递给我的服务。
答案 0 :(得分:26)
不确定这是否是最佳方式,但添加此功能对我有用,
$this->container->enterScope('request');
$this->container->set('request', new Request(), 'request');
答案 1 :(得分:6)
Stof引用:
如果您使用基于请求的资产助手(从中获取基本网址) 请求对象),它不能像你一样从CLI中使用 那里没有请求
翻译,如果您打算在CLI中使用它,则无法在模板中使用asset
功能。
答案 2 :(得分:1)
问题出现是因为您在模板中使用 asset(),这取决于 Request ,并且命令行中没有 Request 应用
快速修复:
framework:
templating:
assets_base_urls: { http: ["http://yoursite.com"], ssl: ["http://yoursite.com"] }