2013-01-15 16 views
6

Vorrei caricare alcuni modelli di Twig dal database nell'applicazione Symfony2, pur mantenendo la possibilità di utilizzare il caricatore nativo per eseguire il rendering dei modelli nelle posizioni standard del filesystem. Come ottenere questo?Come registrare un altro caricatore twig (personalizzato) nell'ambiente Symfony2?

Per quanto ho capito, non è possibile registrare più caricatori nell'ambiente Twig. Ho pensato due modi (per ora):

  • Replace the default loader con una classe proxy personalizzata. Quando i modelli vengono indirizzati con lo standard @ Notazione pacchetto, il proxy passa la richiesta al caricatore predefinito. In altri casi, la richiesta sarebbe passata al mio caricatore personalizzato (database); OR
  • Costruisci un ambiente Twig completamente nuovo. Questo metodo avrebbe richiesto la registrazione estensioni di Twig personalizzate per entrambi gli ambienti e non permettere i modelli con riferimenti incrociati provenienti da fonti diverse (alcuni da @Bundles, alcuni dal database)

Update 1:

Sembra che Twig supporti la classe Twig_Loader_Chain che potrebbe essere utilizzata nella mia prima opzione. Tuttavia, il caricatore predefinito dovrebbe essere accessibile e passato alla catena come prima opzione.

risposta

6

Per utilizzare Twig_Loader_Chain è necessario Symfony 2.2 https://github.com/symfony/symfony/pull/6131
Poi si può semplicemente configurate le vostre caricatori:

services: 
    twig.loader.filesystem: 
     class: %twig.loader.filesystem.class% 
     arguments: 
      - @templating.locator 
      - @templating.name_parser 
     tags: 
      - { name: twig.loader } 
    twig.loader.string: 
     class: %twig.loader.string.class% 
     tags: 
      - { name: twig.loader } 

Aggiornamento:
Sembra che ci sono ancora alcuni problemi (la loader del filesystem non è riuscito a trovare i modelli somtimes) ma ho trovato questo:
http://forum.symfony-project.org/viewtopic.php?t=40382&p=131254

Sembra funzionare alla grande!

+0

Questo problema è stato risolto in Symfony 2.3? – Dayson

+3

Mi rendo conto che questo è un thread vecchio, ma aggiungendo la configurazione precedente si impedisce la visualizzazione dei modelli di debug del profilo Web: al suo posto viene visualizzata la seguente stringa nella parte inferiore dello schermo: @ WebProfiler/Profiler/toolbar_js.html.twig How posso risolvere questo? – Tocacar

0

questo è un modo economico e allegro per modificare temporaneamente il caricatore nella norma ENV:

// Keep the current loader 
    $oldLoader = $env->getLoader(); 

    // Temporarily set a string loader 
    $env->setLoader(new \Twig_Loader_String()); 

    // Resolve the template - but don't render it yet. 
    $template = $env->resolveTemplate($template); 

    // Restore the old loader 
    $env->setLoader($oldLoader); 

    // Render the template. This will pass the old loader into any subtemplates and make sure your string based template gets into the cache. 
    $result = $template->render($context); 

Suppongo che questo funzionerà con altri caricatori personalizzati.

+0

Sembra fantastico, ma come si ottiene l'ambiente Twig in Symfony? – Stan

Problemi correlati