2012-04-01 13 views
10

Estoy empezando a usar Symfony 2, pero me gustaría usar bigote como lenguaje de plantillas en lugar de Twig o PHP. Quiero usar bigote porque es totalmente sin lógica y porque también puedo usarlo en javascript si decido manejar la representación de la plantilla en el lado del cliente.Usando Moustache como lengua de plantillas en Symfony 2

¿Algún consejo sobre cómo hacer eso?

+0

He estado pensando en terminar esto por un tiempo ... https://github.com/bobthecow/BobthecowMustacheBundle No dude en bifurcar y ayudar. – bobthecow

+0

@bobthecow lo bifurqué, soy bastante nuevo en symfony2 y creo que me tomará un tiempo entender todo, especialmente porque esto se hace en mi tiempo libre, en cualquier caso ¡gracias! :) –

+0

A partir de la última confirmación, mi paquete funciona con Symfony2 v2.1.0-DEV :) – bobthecow

Respuesta

28

Alguna información adicional que se extiende @ m2mdas respuesta.

Si todavía no está familiarizado con los sistemas de plantillas de Symfony y lote de configuración de echar un vistazo a estos antes de empezar a programar:

Y ahora una receta rápida para que comiences Tome lo siguiente como ejemplos sueltos, sin necesidad de seguir con los nombres elegidos.

1. Cree un Resources/config/mustache.xml para definir sus servicios e identificar su servicio de motor de plantillas (etiquételo como "templating.engine").

Puede usar Yaml y PHP en lugar de XML, pero este último se prefiere para los paquetes "públicos".

<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> 

Ejemplos:

2. Crear una clase Extension para manejar la configuración semántica para y nuestro paquete

<?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 
} 

La presencia de la clase anterior significa que ahora se puede definir un espacio de nombres de configuración mustache en cualquier archivo de configuración.

Ejemplos:

3. [Opcional] crear una clase Configuration para validar y fusionar configuración

<?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 
    } 
} 

Ejemplos:

4. Crear un MustacheEngine que implementa 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; 
    } 

Ejemplos:

5. Activar el motor de su brillante nueva plantilla en el archivo de configuración de la aplicación:

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

6. Pruebe que

<?php 
// src/Acme/HelloBundle/Controller/HelloController.php 

public function indexAction($name) 
{ 
    return $this->render('AcmeHelloBundle:Hello:index.html.mustache', array('name' => $name)); 
} 

Puede compartir un enlace a su repositorio de paquetes para que podamos seguir el progreso y ayudar si es necesario. Buena suerte.

+0

Gracias, esta es una muy buena respuesta, publicaré el código tan pronto como escriba algo (estoy usando simfony2 para mis proyectos personales!) :) –

+1

noisebleed: great writeup. ayudó mucho :) - https://github.com/bobthecow/BobthecowMustacheBundle – bobthecow

5

Debe crear una clase que implemente EngineInterface y crear crear un servicio de DIC llamado templating.engine.mustache para hacer referencia a la clase. Y luego en app/config.yml puede establecer el motor predeterminado.

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

Como referencia se puede comprobar PhpEngine clase y su service definition.

+1

Esto. Tengo un 80% terminado ... Puedo publicarlo si quieres jugar :) – bobthecow