Php 如何使用自定义细枝扩展在Symfony中使用会话

Php 如何使用自定义细枝扩展在Symfony中使用会话,php,symfony,twig,Php,Symfony,Twig,我需要什么 我只想在symfony中实现会话 这是我试过的 /src/Acme/bundlename/Twig Acmeextension.php public function getFunctions() { return array( 'count' => new \Twig_Function_Method($this, 'count'), ); } public function count() { session_start(); if(i

我需要什么

  • 我只想在symfony中实现会话
这是我试过的

  • /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;
    }
    
    这是细枝的代码:

    function callback()
    {
        var page = {{ count}};
        if (page >4)
        {
            alert("limit exceeded");            
        }
        else
        {
          alert("ok");                 
        }
    }
    callback();
    
    • 我只想计算一下浏览量
    • 我在twig中使用了脚本,这样我就可以在有页面视图的情况下显示超过4条的警告消息
    • 我使用了symfony自定义函数,以便在symfony中使用$SESSION
    • 我已经在核心Php中实现了这段代码,它工作得很好
    • 我已经参考了链接

    • 自定义细枝扩展

问题

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

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

我会这么做的

     //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\u Function\u方法

如果我们忽略新旧版本的
Twig
之间的细微差别,我会这样做

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

细枝服务定义


我尝试过调试代码,但仍然无法运行警报{%block myJavascript%}警报(“测试”);{%endblock%}如果(会话->有('count'),则此行出现意外语法错误->(T_OBJECT_运算符){@Matthew:我想你把它和
服务容器
结合起来太复杂了。请看我基于你的答案,但有点简化;@user3785613这就是你复制和粘贴的结果。我省略了$sign lohow来解决警报问题函数callback(){var page={{{count};if(page>4){alert(“超出限制”)}else{alert(“ok”);}}}callback();调用twig{{count}}哇,慢一点。你从一个错误到另一个错误都没有注意。首先,你不能只使用
{count}
因为
Twig
会认为那是一个
变量
。相反,使用
{{count()}
。至于
AcmeExtension
(woot?!)请用您应用的更改编辑您的问题-只有这样,我们才能帮助您…我已经尝试使用javascript调用计数函数,但仍然存在问题,页面重新加载时警报无法工作,因此问题在哪里?它首先没有任何JS。只需打印:
这是我的内容{{count()}
。然后我们可以追溯错误…它现在已修复感谢jperovic sol我已将脚本代码放在正文之后,因为脚本可能会在页面中崩溃,现在工作正常
      <!-- Custom Twig Extensions -->
      <service id="yourid" class="yourclasspath">
        <argument type="service" id="service_container" />
        <tag name="twig.extension" />
    </service>
     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');
      }
   }
<!-- Custom Twig Extensions -->
<service id="yourid" class="yourclasspath">
    <argument type="service" id="session" />
    <tag name="twig.extension" />
</service>
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');
     }
}