Использование усов в качестве языка шаблонов в Symfony 2 - PullRequest
11 голосов
/ 01 апреля 2012

Я начинаю использовать symfony 2, но я бы хотел использовать усы в качестве языка шаблонов вместо Twig или PHP. Я не хочу использовать усы, потому что это совершенно не логично, и потому что я также могу использовать его в javascript, если я решу обработать рендеринг шаблона на стороне клиента.

Как это сделать?

Ответы [ 2 ]

29 голосов
/ 02 апреля 2012

Дополнительная информация расширяет @ m2mdas ответ.

Если вы еще не знакомы с системами шаблонов Symfony и конфигурацией пакета, ознакомьтесь с ними, прежде чем приступить к написанию кода:

А теперь быстрый рецепт, с чего можно начать. Возьмите следующее в качестве свободных примеров, не нужно придерживаться выбранных имен.

1. Создайте Resources/config/mustache.xml для определения ваших служб и для идентификации службы службы шаблонов (пометьте ее как "templating.engine").

Вы можете использовать Yaml и PHP вместо XML, но последний предпочтительнее для "публичных" пакетов.

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

Примеры:

2. Создайте класс Extension для обработки семантической конфигурации вашего пакета.

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

Наличие предыдущего класса означает, что теперь вы можете определить mustache пространство имен конфигурации в любом файле конфигурации.

Примеры:

3. [Необязательно] Создание класса Configuration для проверки и объединения конфигурации

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

Примеры:

4. Создайте MustacheEngine, который реализует 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;
    }

Примеры:

5. Включите ваш новый блестящий шаблонизатор в файле конфигурации приложения:

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

6. Попробуйте

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

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

Вы можете поделиться ссылкой на ваш репозиторий, чтобы мы могли отслеживать прогресс и помогать при необходимости. Удачи.

5 голосов
/ 01 апреля 2012

Вы должны создать класс, который реализует EngineInterface и создать службу DIC с именем templating.engine.mustache для ссылки на класс.И тогда в app/config.yml вы можете установить механизм по умолчанию.

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

Для справки вы можете проверить PhpEngine класс и его определение сервиса .

...