Как использовать сессию в Symfony, используя расширение Twig

Что мне нужно

  • я просто хочу реализовать сессию в Symfony.

вот что я попробовал

  • / SRC / Акме / bundlename / Туиг

    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 }}
    
    • Я просто хочу рассчитать количество просмотров.
    • Я использовал скрипт в ветке, так что я, если есть просмотр страницы более 4, то показать предупреждение.
    • Я использовал пользовательские функции Symfony, чтобы $ SESSION в Symfony.
    • Я реализовал этот код в ядре Php, он работает нормально.
    • я сослался на ссылку Передача сеанса в шаблон TWIG.

    • пользовательское расширение Twig http://symfony.com/doc/current/cookbook/templating/twig_extension.html

проблема

  • Я не получаю никаких предупреждений, когда я перезагружаю страницу.
  • пожалуйста, скажите мне, где я не прав, любые предложения приветствуются.

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

Другие решения

Вы используете более старую версию Twig? Использование Twig_Function_Method устарела.

Если мы игнорируем тонкие различия между старыми и новыми версиями Twig Я бы сделал это так

Примечание: на самом деле это решение @ Мэтью, но я позволил себе немного упростить его 🙂

Определение сервиса 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');
}
}
1

По вопросам рекламы [email protected]