错误:您无法创建非活动范围的服务(“templating.helper.assets”)(“请求”)

时间:2013-07-30 09:07:12

标签: symfony twig

我收到以下错误,

  [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,我已将整个容器传递给我的服务。

3 个答案:

答案 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"] }

更多信息:https://stackoverflow.com/a/24382994/1851915