2012-04-11 8 views
4

Ich benutze Twig in einer Silex-Anwendung. In einem Pre-Request-Hook möchte ich überprüfen, ob ein Benutzer angemeldet ist und ob er das Benutzerobjekt zu Twig hinzufügt (damit ich den eingeloggten/abgemeldeten Status im Menü rendern kann).Eine Variable in der Twig-Ansicht einstellen pre render

Nach dem Quellcode sieht es jedoch so aus, als wäre es nur möglich, Vorlagenansichtsvariablen als Argument für die Rendermethode zu verwenden. Fehle ich hier etwas? Hier

ist genau das, was ich möchte erreichen:

// Code run on every request  

$app->before(function (Request $request) use ($app) 
{ 
    // Check if the user is logged in and if they are 
    // Add the user object to the view 

    $status = $app['userService']->isUserLoggedIn(); 

    if($status) 
    { 
     $user = $app['userService']->getLoggedInUser(); 

     //@todo - find a way to add this object to the view 
     // without rendering it straight away 
    } 

}); 

Antwort

17
$app["twig"]->addGlobal("user", $user); 
15

Zusätzlich zu dem, was Maerlyn sagte, Sie können dies tun:

$app['user'] = $user; 

Und in Ihrer Vorlage verwenden:

{{ app.user }} 
1

können Sieverwendenvorab Werte machen

Beispiel, wenn Zweig Helfer

$container['view'] = function ($c) { 
    $view = new \Slim\Views\Twig('.templatePath/'); 

    // Instantiate and add Slim specific extension 
    $basePath = rtrim(str_ireplace('index.php', '', $c['request']->getUri()->getBasePath()), '/'); 
    $view->addExtension(new Slim\Views\TwigExtension($c['router'], $basePath)); 

    //array for pre render variables 
    $yourPreRenderedVariables = array(
     'HEADER_TITLE' => 'Your site title', 
     'USER' => 'JOHN DOE' 
    ); 
    //this will work for all routes/templates you don't have to define again 
    foreach($yourPreRenderedVariables as $key => $value){ 
     $view->offsetSet($key, $value); 
    } 

    return $view; 
}; 

Registrierung können Sie es auf Vorlage wie diese

<title>{{ HEADER_TITLE }}</title> 
hello {{ USER }}, 
+0

dieser großen gearbeitet: $ view-> offsetSet ($ key, $ value); – Kilise

+0

Slim und Silex sind unterschiedliche Frameworks. Ich denke, du solltest zuerst den Titel, den Körper und die Tags der Frage notieren – Trix

0

Die answer provided by Maerlyn ist falsch, verwenden, da es keine Notwendigkeit zu verwenden ist addGlobal, da das Objekt user bereits in der globalen Variablen der Umgebung in Zweig existiert, wie die documentation sagt:

Globale Variable

Wenn der Zweig Brücke verfügbar ist, bezieht sich auf die globale Variable auf eine Instanz App Variable. Es gibt Zugang zu den folgenden Methoden:

{# The current Request #} 
{{ global.request }} 

{# The current User (when security is enabled) #} 
{{ global.user }} 

{# The current Session #} 
{{ global.session }} 

{# The debug flag #} 
{{ global.debug }} 

Aso nach den documentation, wenn Sie ein anderen globalen genannt foo zum Beispiel hinzufügen mögen, sollten Sie tun:

$app->extend('twig', function($twig, $app) { 
    $twig->addGlobal('foo', 127);     // foo = 127 
    return $twig; 
}); 

Nach der Registrierung der Zweig Service.

den Zweig Service Registrierung ist so einfach wie:

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/views', 
)); 
Verwandte Themen