optimized templating layer

You must now explicitly register the templating engine you want to use:

  <app:templating>
      <app:engine id="twig" />
  </app:templating>

  app.templating:
      engines: ['twig']

Symfony2 comes with two such engines: 'twig', and 'php'.
This commit is contained in:
Fabien Potencier 2011-01-23 15:41:31 +01:00
parent 5e625d1f52
commit 9310eea57a
8 changed files with 113 additions and 101 deletions

View File

@ -36,20 +36,5 @@ class TemplatingPass implements CompilerPassInterface
$definition->addMethodCall('setHelpers', array($helpers));
}
}
if ($container->hasDefinition('templating.engine.delegating')) {
$queue = new \SplPriorityQueue();
$order = PHP_INT_MAX;
foreach ($container->findTaggedServiceIds('templating.engine') as $id => $attributes) {
$queue->insert($id, array(isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0, --$order));
}
$engines = array();
foreach ($queue as $engine) {
$engines[] = $engine;
}
$container->getDefinition('templating.engine.delegating')->addMethodCall('setEngineIds', array($engines));
}
}
}

View File

@ -205,9 +205,10 @@ class FrameworkExtension extends Extension
{
$config = isset($config['templating']) ? $config['templating'] : array();
if (!$container->hasDefinition('templating')) {
if (!$container->hasDefinition('templating.locator')) {
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load('templating.xml');
$loader->load('templating_php.xml');
if ($container->getParameter('kernel.debug')) {
$loader->load('templating_debug.xml');
@ -255,6 +256,24 @@ class FrameworkExtension extends Extension
$container->setParameter('templating.loader.cache.path', $config['cache']);
}
// engines
if (!$engines = $this->normalizeConfig($config, 'engine')) {
throw new \LogicException('You must register at least one templating engine.');
}
foreach ($engines as $i => $engine) {
$engines[$i] = new Reference('templating.engine.'.(is_array($engine) ? $engine['id'] : $engine));
}
if (1 === count($engines)) {
$container->setAlias('templating', (string) $engines[0]);
} else {
$def = $container->getDefinition('templating.engine.delegating');
$def->setArgument(1, $engines);
$container->setAlias('templating', 'templating.engine.delegating');
}
// compilation
$this->addClassesToCompile(array(
'Symfony\\Component\\Templating\\DelegatingEngine',

View File

@ -63,9 +63,10 @@
</xsd:complexType>
<xsd:complexType name="templating">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="loader" type="xsd:string" />
</xsd:choice>
<xsd:sequence>
<xsd:element name="loader" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="engine" type="templating_engine" minOccurs="1" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="assets-version" type="xsd:string" />
<xsd:attribute name="assets-base-urls" type="xsd:string" />
@ -88,4 +89,8 @@
<xsd:complexType name="esi">
<xsd:attribute name="enabled" type="xsd:boolean" />
</xsd:complexType>
<xsd:complexType name="templating_engine">
<xsd:attribute name="id" type="xsd:string" />
</xsd:complexType>
</xsd:schema>

View File

@ -6,22 +6,11 @@
<parameters>
<parameter key="templating.engine.delegating.class">Symfony\Bundle\FrameworkBundle\Templating\DelegatingEngine</parameter>
<parameter key="templating.engine.php.class">Symfony\Bundle\FrameworkBundle\Templating\PhpEngine</parameter>
<parameter key="templating.name_parser.class">Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateNameParser</parameter>
<parameter key="templating.locator.class">Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateLocator</parameter>
<parameter key="templating.loader.filesystem.class">Symfony\Bundle\FrameworkBundle\Templating\Loader\FilesystemLoader</parameter>
<parameter key="templating.loader.cache.class">Symfony\Component\Templating\Loader\CacheLoader</parameter>
<parameter key="templating.loader.chain.class">Symfony\Component\Templating\Loader\ChainLoader</parameter>
<parameter key="templating.helper.slots.class">Symfony\Component\Templating\Helper\SlotsHelper</parameter>
<parameter key="templating.helper.assets.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\AssetsHelper</parameter>
<parameter key="templating.helper.actions.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\ActionsHelper</parameter>
<parameter key="templating.helper.router.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\RouterHelper</parameter>
<parameter key="templating.helper.request.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\RequestHelper</parameter>
<parameter key="templating.helper.session.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\SessionHelper</parameter>
<parameter key="templating.helper.code.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\CodeHelper</parameter>
<parameter key="templating.helper.translator.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper</parameter>
<parameter key="templating.helper.security.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\SecurityHelper</parameter>
<parameter key="templating.helper.form.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper</parameter>
<parameter key="templating.assets.version">null</parameter>
<parameter key="templating.assets.base_urls" type="collection"></parameter>
<parameter key="debug.file_link_format">null</parameter>
@ -30,13 +19,7 @@
<services>
<service id="templating.engine.delegating" class="%templating.engine.delegating.class%" public="false">
<argument type="service" id="service_container" />
</service>
<service id="templating.engine.php" class="%templating.engine.php.class%">
<tag name="templating.engine" priority="128" />
<argument type="service" id="service_container" />
<argument type="service" id="templating.loader" />
<call method="setCharset"><argument>%kernel.charset%</argument></call>
<argument type="collection" />
</service>
<service id="templating.name_parser" class="%templating.name_parser.class%">
@ -63,60 +46,6 @@
<call method="setDebugger"><argument type="service" id="templating.debugger" on-invalid="ignore" /></call>
</service>
<service id="templating.helper.slots" class="%templating.helper.slots.class%">
<tag name="templating.helper" alias="slots" />
</service>
<service id="templating.helper.assets" class="%templating.helper.assets.class%">
<tag name="templating.helper" alias="assets" />
<argument type="service" id="request" strict="false" />
<argument>%templating.assets.base_urls%</argument>
<argument>%templating.assets.version%</argument>
</service>
<service id="templating.helper.request" class="%templating.helper.request.class%">
<tag name="templating.helper" alias="request" />
<argument type="service" id="request" strict="false" />
</service>
<service id="templating.helper.session" class="%templating.helper.session.class%">
<tag name="templating.helper" alias="session" />
<argument type="service" id="request" strict="false" />
</service>
<service id="templating.helper.router" class="%templating.helper.router.class%">
<tag name="templating.helper" alias="router" />
<argument type="service" id="router" />
</service>
<service id="templating.helper.actions" class="%templating.helper.actions.class%">
<tag name="templating.helper" alias="actions" />
<argument type="service" id="http_kernel" />
</service>
<service id="templating.helper.code" class="%templating.helper.code.class%">
<tag name="templating.helper" alias="code" />
<argument>%debug.file_link_format%</argument>
<argument>%kernel.root_dir%</argument>
</service>
<service id="templating.helper.translator" class="%templating.helper.translator.class%">
<tag name="templating.helper" alias="translator" />
<argument type="service" id="translator" />
</service>
<service id="templating.helper.security" class="%templating.helper.security.class%">
<tag name="templating.helper" alias="security" />
<argument type="service" id="security.context" on-invalid="ignore" />
</service>
<service id="templating.helper.form" class="%templating.helper.form.class%">
<tag name="templating.helper" alias="form" />
<argument type="service" id="templating" />
</service>
<service id="templating.loader" alias="templating.loader.filesystem" />
<service id="templating" alias="templating.engine.delegating" />
</services>
</container>

View File

@ -0,0 +1,80 @@
<?xml version="1.0" ?>
<container xmlns="http://www.symfony-project.org/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="templating.engine.php.class">Symfony\Bundle\FrameworkBundle\Templating\PhpEngine</parameter>
<parameter key="templating.helper.slots.class">Symfony\Component\Templating\Helper\SlotsHelper</parameter>
<parameter key="templating.helper.assets.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\AssetsHelper</parameter>
<parameter key="templating.helper.actions.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\ActionsHelper</parameter>
<parameter key="templating.helper.router.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\RouterHelper</parameter>
<parameter key="templating.helper.request.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\RequestHelper</parameter>
<parameter key="templating.helper.session.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\SessionHelper</parameter>
<parameter key="templating.helper.code.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\CodeHelper</parameter>
<parameter key="templating.helper.translator.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper</parameter>
<parameter key="templating.helper.security.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\SecurityHelper</parameter>
<parameter key="templating.helper.form.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper</parameter>
</parameters>
<services>
<service id="templating.engine.php" class="%templating.engine.php.class%" public="false">
<argument type="service" id="service_container" />
<argument type="service" id="templating.loader" />
<call method="setCharset"><argument>%kernel.charset%</argument></call>
</service>
<service id="templating.helper.slots" class="%templating.helper.slots.class%">
<tag name="templating.helper" alias="slots" />
</service>
<service id="templating.helper.assets" class="%templating.helper.assets.class%">
<tag name="templating.helper" alias="assets" />
<argument type="service" id="request" strict="false" />
<argument>%templating.assets.base_urls%</argument>
<argument>%templating.assets.version%</argument>
</service>
<service id="templating.helper.request" class="%templating.helper.request.class%">
<tag name="templating.helper" alias="request" />
<argument type="service" id="request" strict="false" />
</service>
<service id="templating.helper.session" class="%templating.helper.session.class%">
<tag name="templating.helper" alias="session" />
<argument type="service" id="request" strict="false" />
</service>
<service id="templating.helper.router" class="%templating.helper.router.class%">
<tag name="templating.helper" alias="router" />
<argument type="service" id="router" />
</service>
<service id="templating.helper.actions" class="%templating.helper.actions.class%">
<tag name="templating.helper" alias="actions" />
<argument type="service" id="http_kernel" />
</service>
<service id="templating.helper.code" class="%templating.helper.code.class%">
<tag name="templating.helper" alias="code" />
<argument>%debug.file_link_format%</argument>
<argument>%kernel.root_dir%</argument>
</service>
<service id="templating.helper.translator" class="%templating.helper.translator.class%">
<tag name="templating.helper" alias="translator" />
<argument type="service" id="translator" />
</service>
<service id="templating.helper.security" class="%templating.helper.security.class%">
<tag name="templating.helper" alias="security" />
<argument type="service" id="security.context" on-invalid="ignore" />
</service>
<service id="templating.helper.form" class="%templating.helper.form.class%">
<tag name="templating.helper" alias="form" />
<argument type="service" id="templating.engine.php" />
</service>
</services>
</container>

View File

@ -30,15 +30,10 @@ class DelegatingEngine extends BaseDelegatingEngine implements EngineInterface
*
* @param ContainerInterface $container The DI container
*/
public function __construct(ContainerInterface $container)
public function __construct(ContainerInterface $container, array $engineIds)
{
$this->container = $container;
$this->engines = array();
}
public function setEngineIds($ids)
{
$this->engines = $ids;
$this->engines = $engineIds;
}
/**

View File

@ -34,7 +34,7 @@ class FrameworkExtensionTest extends TestCase
$this->assertEquals('Symfony\Component\HttpKernel\Profiler\Profiler', $container->getParameter('profiler.class'), '->configLoad() loads the collectors.xml file if not already loaded');
// templating
$loader->configLoad(array(array('templating' => array())), $container);
$loader->configLoad(array(array('templating' => array('engines' => array('php')))), $container);
$this->assertEquals('Symfony\\Bundle\\FrameworkBundle\\Templating\\PhpEngine', $container->getParameter('templating.engine.php.class'), '->templatingLoad() loads the templating.xml file if not already loaded');
// validation

View File

@ -29,8 +29,7 @@
<argument type="service" id="templating.locator" />
</service>
<service id="templating.engine.twig" class="%templating.engine.twig.class%">
<tag name="templating.engine" priority="255" />
<service id="templating.engine.twig" class="%templating.engine.twig.class%" public="false">
<argument type="service" id="service_container" />
<argument type="service" id="twig" />
<argument type="service" id="twig.globals" />