Как использовать механизм шаблонов PHP в Twig вместо синтаксиса Twig в Silex

В Silex я могу использовать шаблоны Twig, но я хочу использовать PHP-движок Twig вместо синтаксиса Twig. Например, это руководство описывает, как это сделать для Symfony, но не для Silex.

Мой Силекс index.php выглядит так:

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

$app->get('/', function() use ($app) {
    return $app['twig']->render('index.html.php', array(
        'name' => 'Bob',
    ));
});

Мой index.html.php выглядит так:

<p>Welcome to the index <?php echo $view->name; ?></p>

Когда я запускаю приложение в браузере и просматриваю исходный код, я вижу буквальную строку <?php echo $view->name; ?>, которая не была выполнена.

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

<p>Welcome to the index {{ name }} </p>

Затем это работает, и я вижу имя Bob, поэтому я знаю, что это не проблема веб-сервера или конфигурации PHP.


person ServerBloke    schedule 07.03.2014    source источник


Ответы (1)


Если вы хотите имитировать это поведение в Silex, вам необходимо установить TwigBridge через Composer. Затем создайте службу templating так же, как это делает Symfony.

Это решение работает, поскольку я успешно его протестировал.

<?php

require __DIR__.'/vendor/autoload.php';

use Silex\Application;
use Symfony\Component\Templating\PhpEngine;
use Symfony\Component\Templating\TemplateNameParser;
use Symfony\Component\Templating\Loader\FilesystemLoader;
use Symfony\Component\Templating\DelegatingEngine;
use Symfony\Bridge\Twig\TwigEngine;

$app = new Application();

$app['debug'] = true;

// Register Twig

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


// Build the templating service

$app['templating.engines'] = $app->share(function() {
    return array(
        'twig',
        'php'
    );
});

$app['templating.loader'] = $app->share(function() {
    return new FilesystemLoader(__DIR__.'/views/%name%');
});

$app['templating.template_name_parser'] = $app->share(function() {
    return new TemplateNameParser();
});

$app['templating.engine.php'] = $app->share(function() use ($app) {
    return new PhpEngine($app['templating.template_name_parser'], $app['templating.loader']);
});

$app['templating.engine.twig'] = $app->share(function() use ($app) {
    return new TwigEngine($app['twig'], $app['templating.template_name_parser']);
});

$app['templating'] = $app->share(function() use ($app) {
    $engines = array();

    foreach ($app['templating.engines'] as $i => $engine) {
        if (is_string($engine)) {
            $engines[$i] = $app[sprintf('templating.engine.%s', $engine)];
        }
    }

    return new DelegatingEngine($engines);
});


// Render controllers

$app->get('/', function () use ($app) {
    return $app['templating']->render('hello.html.twig', array('name' => 'Fabien'));
});

$app->get('/hello/{name}', function ($name) use ($app) {
    return $app['templating']->render('hello.html.php', array('name' => $name));
});

$app->run();

Вам понадобятся как минимум эти зависимости для достижения этого в вашем composer.json

"require": {
    "silex/silex": "~1.0",
    "symfony/twig-bridge": "~2.0",
    "symfony/templating": "~2.0",
    "twig/twig": "~1.0"
},
person Adam Elsodaney    schedule 07.03.2014
comment
+1 Спасибо за подробный ответ. Можно ли вручную скопировать нужные файлы вместо использования Composer? - person ServerBloke; 07.03.2014
comment
@ServerBloke np, Composer сделает это за вас. Я добавил в ответ то, что вам нужно в composer.json. - person Adam Elsodaney; 07.03.2014
comment
Спасибо, принял ваш ответ. Будет ли Composer просто загружать нужные мне файлы в проект? Я не знаком с этим, но рассмотрю его, если это лучше, чем копирование файлов вручную. - person ServerBloke; 07.03.2014
comment
Спасибо, это очень помогло! Я завернул его в собственный ServiceProvider и установил путь $app['root.views'] для глобальной настройки расположения шаблонов. - person dazz; 03.07.2014