wake-up-neo.com

Auf Sitzung über TWIG-Vorlage zugreifen

Ich habe im Internet viel nach dem Zugriff auf das globale $_SESSION-Array von TWIG template gesucht und Folgendes gefunden: {{app.session.get('index')}}, aber wenn ich es anrufe, gibt es eine leere Zeichenfolge zurück. Ich habe einen $_SESSION['filter']['accounts'] und erhalte diese Fehlermeldung beim Aufruf von {{app.session.get('filter').accounts}}: Item "accounts" for "" does not exist. Was mache ich falsch?

52
haynar

{{app.session}} bezieht sich auf das Session-Objekt und nicht auf das $_SESSION-Array. Ich denke nicht, dass das $_SESSION-Array zugänglich ist, wenn Sie es nicht explizit an jede Twig-Vorlage übergeben oder wenn Sie eine Erweiterung verwenden, die es verfügbar macht.

Da Symfony2 objektorientiert ist, sollten Sie das Session-Objekt verwenden, um Sitzungsattribute festzulegen und sich nicht auf das Array zu verlassen. Das Session-Objekt wird dieses Zeug von Ihnen abstrahieren, sodass Sie beispielsweise die Sitzung in einer Datenbank speichern können, da das Speichern der Sitzungsvariablen für Sie verborgen ist.

Legen Sie also Ihr Attribut in der Sitzung fest und rufen Sie den Wert in Ihrer Zweigvorlage mithilfe des Session-Objekts ab.

// In a controller
$session = $this->get('session');
$session->set('filter', array(
    'accounts' => 'value',
));

// In Twig
{% set filter = app.session.get('filter') %}
{% set account-filter = filter['accounts'] %}

Hoffe das hilft.

Grüße,
Matt

128
Matt

Ein einfacher Trick besteht darin, das $ _SESSION-Array als globale Variable zu definieren. Bearbeiten Sie dazu die Datei core.php im Erweiterungsordner, indem Sie diese Funktion hinzufügen:

public function getGlobals() {
    return array(
        'session'   => $_SESSION,
    ) ;
}

Anschließend können Sie auf jede Sitzungsvariable zugreifen:

{{ session.username }}

wenn Sie auf zugreifen möchten

$_SESSION['username']
20
Henry

Setup-Zweig

$twig = new Twig_Environment(...);    
$twig->addGlobal('session', $_SESSION);

Dann können Sie beispielsweise innerhalb Ihrer Vorlage auf Sitzungswerte zugreifen

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template
17
user1279047

Der Zugriff auf eine Sitzungsvariable in Twig ist wie folgt:

{{ app.session.get('name_variable') }}
11
joan16v

Ich habe festgestellt, dass dies der sauberste Weg ist, eine benutzerdefinierte TwigExtension zu erstellen und die getGlobals()-Methode zu überschreiben. Anstatt $_SESSION zu verwenden, ist es auch besser, die Session-Klasse von Symfony zu verwenden, da die Sitzung automatisch gestartet/gestoppt wird.

Ich habe die folgende Erweiterung in /src/AppBundle/Twig/AppExtension.php :

<?php    
namespace AppBundle\Twig;

use Symfony\Component\HttpFoundation\Session\Session;

class AppExtension extends \Twig_Extension {

    public function getGlobals() {
        $session = new Session();
        return array(
            'session' => $session->all(),
        );
    }

    public function getName() {
        return 'app_extension';
    }
}

Dann fügen Sie dies in /app/config/services.yml ein:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }

Dann kann auf die Sitzung von jeder Ansicht aus zugegriffen werden:

{{ session.my_variable }}
5
this.lau_

Warum verwenden Sie {{app.object name.field name}} nicht, um auf die Variable zuzugreifen?

0
Somnath De