如何使用自定义Twig扩展在Symfony中使用Session

时间:2014-09-17 10:05:53

标签: php symfony twig

我需要什么

  • 我只想在symfony中实现会话。

这是我试过的

  • / SRC / Acme公司/软件包名称/枝条

    Acmeextension.php

    public function getFunctions()
    {
      return array(
    'count'  => new \Twig_Function_Method($this, 'count'),
     );
     }   
    
    public function count()
    {
        session_start();
        if(isset($_SESSION["count"]))
        {
            $accesses = $_SESSION["count"] + 1;
        }
        else
        {
            $accesses = 1;
        }
        $_SESSION["count"] = $accesses;
        return $accesses;
    }
    

    这是树枝的代码:

    function callback()
    {
        var page = {{ count}};
        if (page >4)
        {
            alert("limit exceeded");            
        }
        else
        {
          alert("ok");                 
        }
    }
    callback();
    
     
    calling in twig 
    {{ count }}
    

问题

  • 当我重新加载页面时,我没有任何提醒。
  • 请告诉我哪里错了,欢迎提出任何建议。

2 个答案:

答案 0 :(得分:1)

如果您希望将范围之外的会话注入自定义扩展程序。

我会这样做。

     //AppKernel +add
      protected function initializeContainer() {
          parent::initializeContainer();
          if (PHP_SAPI == 'cli') {
              $this->getContainer()->enterScope('request');
              $this->getContainer()->set('request', new \Symfony\Component\HttpFoundation\Request(), 'request');
          }
      }

然后在您的服务容器中

      <!-- Custom Twig Extensions -->
      <service id="yourid" class="yourclasspath">
        <argument type="service" id="service_container" />
        <tag name="twig.extension" />
    </service>

然后在你的twig.php

     class Twig extends \Twig_extension {
         private $request;

         public function __construct(Container $container) {
              $this->request = $container->get('request');
         }

         public function getFunctions() {
           return array(
            'count'  => new \Twig_Function_Method($this, 'count'),
           );
         }    

         public function count() {
         $session = $this->request->getSession();

         if(session->has('count')) {
             $session->set('count') += 1;
         } else {
             $session->set('count') = 1;
         }

         return $session->get('count');
      }
   }

然后在你的树枝上一样

答案 1 :(得分:1)

您使用的是Twig的旧版本吗?不推荐使用Twig_Function_Method

如果我们忽略Twig的旧版本和新版本之间的微妙差异,我会这样做。

注意:这实际上是@Matthew的解决方案,但我冒昧地简化了一下:)

Twig服务定义

<!-- Custom Twig Extensions -->
<service id="yourid" class="yourclasspath">
    <argument type="service" id="session" />
    <tag name="twig.extension" />
</service>

Twig扩展文件

class Twig extends \Twig_extension {
     private $session;

     public function __construct(Session $session) {
         $this->session = $session
     }

     public function getFunctions() {
         return array(
             new \Twig_SimpleFunction('count', array($this, 'count') ),
         );
     }    

     public function count() {
         if($this->session->has('count')) {
             $this->session->set('count') += 1;
         } else {
             $this->session->set('count') = 1;
         }

         return $this->session->get('count');
     }
}