2012-04-01 6 views
10

Ich fange an, symfony 2 zu verwenden, aber ich möchte anstelle von Twig oder PHP Schnurrbart als Templating Sprache verwenden. Ich möchte Schnurrbart verwenden, weil es völlig logiklos ist und weil ich es auch in Javascript verwenden kann, wenn ich mich entscheide, das Rendering der Vorlage clientside zu behandeln.Verwenden von Moustache als Templating Sprache in Symfony 2

Irgendwelche Ratschläge, wie man das macht?

+0

Ich habe gemeint, dies für eine Weile zu beenden ... https://github.com/bobthecow/BobthecowMustacheBundle Fühlen Sie sich frei zu verzweigen und zu helfen. – bobthecow

+0

@bobthecow Ich habe es gegabelt, ich bin ziemlich neu bei symfony2 und ich denke, ich werde etwas Zeit brauchen, um alles zu verstehen, besonders da dies in meiner Freizeit gemacht wird, auf jeden Fall danke! :) –

+0

Ab dem letzten Commit funktioniert mein Bundle mit Symfony2 v2.1.0-DEV :) – bobthecow

Antwort

28

Einige zusätzliche Informationen erweitern @ m2mdas Antwort.

Wenn Sie mit Symfony Templating-Systeme noch nicht so vertraut sind und bündeln Konfiguration an diese einen Blick darauf werfen, bevor Sie Codierung starten:

Und jetzt ein schnelles Rezept, um loszulegen. Nehmen Sie das Folgende als lose Beispiele, keine Notwendigkeit, bei den gewählten Namen zu bleiben.

1. Erstellen Sie eine Resources/config/mustache.xml, um Ihre Dienste zu definieren und Ihren Vorlagen-Engine-Dienst zu identifizieren (markieren Sie ihn als "templating.engine").

Sie könnten Yaml und PHP anstelle von XML verwenden, aber Letzteres wird für "öffentliche" Bundles bevorzugt.

<service id="mustache" class="Mustache"> 
    <file>Mustache.php</file> 
</service> 

<service id="templating.engine.mustache" class="MustacheBundle\MustacheEngine" public="false"> 
     <argument type="service" id="mustache" /> 
     <argument type="service" id="templating.name_parser"/> 
     <argument type="service" id="templating.loader" /> 
     <tag name="templating.engine" /> 
</service> 

Beispiele:

2. Extension eine Klasse erzeugen, die semantische Konfiguration für y zu handhaben unser Bündel.

<?php 

namespace MustacheBundle; 

use Symfony\Component\HttpKernel\DependencyInjection\Extension; 
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; 

class MustacheExtension extends Extension 
{ 
    $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 
    $loader->load('mustache.xml'); 

    // you may parse the $configs array here 
    // see: http://symfony.com/doc/current/cookbook/bundles/extension.html#parsing-the-configs-array 
} 

Das Vorhandensein der vorherigen Klasse bedeutet, dass Sie jetzt eine mustache Konfiguration Namespace in jeder Konfigurationsdatei festlegen können.

Beispiele:

3. [Optional] erstellen Configuration Klassen-Konfiguration

<?php 

namespace Mustache\DependencyInjection; 

use Symfony\Component\Config\Definition\Builder\TreeBuilder; 
use Symfony\Component\Config\Definition\ConfigurationInterface; 

class Configuration implements ConfigurationInterface 
{ 
    public function getConfigTreeBuilder() 
    { 
     $treeBuilder = new TreeBuilder(); 
     $rootNode = $treeBuilder->root('mustache'); 

     // see: http://symfony.com/doc/current/cookbook/bundles/extension.html#validation-and-merging-with-a-configuration-class 
    } 
} 
zu validieren und fusionieren

Beispiele:

4. Erstellen Sie eine MustacheEngine die EngineInterface

<?php 

namespace MustacheBundle; 

use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface; 
use Symfony\Component\Templating\TemplateNameParserInterface; 
use Symfony\Component\Templating\Loader\LoaderInterface; 

use Symfony\Component\HttpFoundation\Response; 

class MustacheBundle implements EngineInterface 
{ 
    public function __construct(\Mustache $mustache, TemplateNameParserInterface $parser, LoaderInterface $loader) 
    { 
     $this->mustache = $mustache; 
     $this->parser = $parser; 
    } 

    public function render($name, array $parameters = array()) 
    { 
     $template = $this->load($name); 

     return $this->mustache->render($template); 
    } 

    // Renders a view and returns a Response. 
    public function renderResponse($view, array $parameters = array(), Response $response = null) 
    { 
     if (null === $response) { 
      $response = new Response(); 
     } 

     $response->setContent($this->render($view, $parameters)); 

     return $response; 
    } 

    // Returns true if the template exists. 
    public function exists($name) 
    { 
     try { 
      $this->load($name); 
     } catch (\InvalidArgumentException $e) { 
      return false; 
     } 

     return true; 
    } 

    // Returns true if this class is able to render the given template. 
    public function supports($name) 
    { 
     $template = $this->parser->parse($name); 

     return 'mustache' === $template->get('engine'); 
    } 

    // Loads the given template. 
    // Should return the template name or a Mustache template object 
    protected function load($name) 
    { 
     $template = $this->parser->parse($name); 
     $template = $this->loader->load($template); 

     return (string) $template; 
    } 

Beispiele implementiert:

5. Aktivieren Sie Ihre glänzende neue Template-Engine in der Anwendungskonfigurationsdatei:

# app/config/config.yml 
templating: { engines: ['twig', 'mustache'] } 

6. Versuchen Sie es

Sie können einen Link zu Ihrem Bundle-Repository freigeben, damit wir den Fortschritt verfolgen und bei Bedarf helfen können. Viel Glück.

+0

Danke, das ist eine wirklich gute Antwort, ich poste den Code sobald ich etwas schreibe (ich benutze simfony2 für meine persönlichen Projekte!) :) –

+1

noisebleed: super write-up. es half eine Tonne :) - https://github.com/bobthecow/BobthecowMustacheBundle – bobthecow

5

Sie müssen eine Klasse erstellen, die EngineInterface implementiert, und create erstellen Sie einen DIC-Dienst mit dem Namen templating.engine.mustache, um die Klasse zu verweisen. Und dann in app/config.yml können Sie die Standard-Engine festlegen.

#app/config.yml 
framework: 
    #..... 
    templating: 
     engines: ['mustache'] //mustache is the last portion of the service id 

Als Referenz können Sie PhpEngine Klasse und ihre service definition überprüfen.

+1

This. Ich habe eine 80% fertig ... Ich kann es veröffentlichen, wenn Sie spielen wollen :) – bobthecow