【问题标题】:How to Use Session in Symfony using Custom Twig Extension如何使用自定义 Twig 扩展在 Symfony 中使用 Session
【发布时间】:2014-11-11 07:39:00
【问题描述】:

我需要什么

  • 我只想在 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;
    }
    

    这里是twig的代码:

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

问题

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

【问题讨论】:

  • 我已经尝试调试代码,但仍然警告不工作 {% block myJavascript %} {% endblock %}

标签: php symfony twig


【解决方案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');
      }
   }

然后在你的树枝上也一样

【讨论】:

  • 语法错误意外 ->(T_OBJECT_OPERATOR) ON THIS LINE if(session->has('count')) {
  • @Matthew:我认为您使用service_container 过于复杂了。根据您的答案查看我的答案,但有点简化;)
  • @user3785613 这就是复制和粘贴所得到的我省略了 $ 符号哈哈
  • 如何解决警报问题 function callback() { var page = {{ count}}; if (page >4) { alert("超出限制"); } 其他 { 警报(“确定”); } } 打回来();调用树枝 {{ count }}
  • 哇,慢点。您甚至没有注意就从一个错误转到另一个错误。首先,您不能只使用{{ count }},因为Twig 会认为这是variable。相反,请使用{{ count() }}。至于AcmeExtension(呜呜?!)请用您应用的更改编辑您的问题 - 只有这样我们才能帮助您...
【解决方案2】:

您使用的是旧版本的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>

树枝扩展文件

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

【讨论】:

  • 我已经尝试使用 javascript 调用计数功能,但仍然存在问题,页面重新加载时没有警报,所以问题出在哪里
  • 先尝试任何JS。只需打印:&lt;h1&gt;THIS IS MY CONTER {{ count() }}。然后我们可以追溯错误...
  • 它现在已经修复感谢 jperovic sol 我已经在正文之后放置了脚本代码,因为可能脚本可能会在页面中崩溃现在它工作正常
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多