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


How to Use Session in Symfony using Custom Twig Extension

我需要什么

  • 我只想在symfony中实现session

这是我试过的

  • /src/Acme/bundlename/Twig

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

    这是trick的代码:

    function callback()
    {
        var page = {{ count}};
        if (page >4)
        {
            alert("limit exceeded");            
        }
        else
        {
          alert("ok");                 
        }
    }
    callback();
    
    calling in twig 
    {{ count }}
    
    • 我只想计算页面浏览量
    • 我在trick中使用了脚本,这样我如果有页面视图超过4,就会显示警告消息
    • 我使用了symfony自定义函数,因此在symfony中使用了$SESSION
    • 我已经在核心Php中实现了这段代码,它运行良好
    • 我已经参考了链接通过会话到TWIG模板。

    • 自定义细枝扩展http://symfony.com/doc/current/cookbook/templating/twig_extension.html

问题

  • 当我重新加载页面时,我没有收到任何警报
  • 请告诉我哪里错了,任何建议都欢迎

如果您希望将作用域之外的会话注入到您的自定义扩展中。

我会这么做的。

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

然后在你的树枝中也是如此

您使用的是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');
     }
}