Skip to content

Commit

Permalink
optimized templating layer
Browse files Browse the repository at this point in the history
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'.
  • Loading branch information
fabpot committed Jan 23, 2011
1 parent 5e625d1 commit 9310eea
Show file tree
Hide file tree
Showing 8 changed files with 113 additions and 101 deletions.
Expand Up @@ -36,20 +36,5 @@ public function process(ContainerBuilder $container)
$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));
}
}
}
Expand Up @@ -205,9 +205,10 @@ protected function registerTemplatingConfiguration(array $config, ContainerBuild
{
$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');
Expand Down Expand Up @@ -255,6 +256,24 @@ protected function registerTemplatingConfiguration(array $config, ContainerBuild
$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',
Expand Down
Expand Up @@ -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>

This comment has been minimized.

Copy link
@trompette

trompette Jan 25, 2011

Contributor

Is it really a <xsd:sequence> or <xsd:all> ?
I've seen a previous commit fixing this issue...

This comment has been minimized.

Copy link
@fabpot

fabpot Jan 25, 2011

Author Member

Cannot be a sequence as we have a max > 1.

<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" />
Expand All @@ -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>
Expand Up @@ -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>
Expand All @@ -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%">
Expand All @@ -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>
@@ -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>
Expand Up @@ -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;
}

/**
Expand Down
Expand Up @@ -34,7 +34,7 @@ public function testConfigLoad()
$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
Expand Down
3 changes: 1 addition & 2 deletions src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml
Expand Up @@ -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" />
Expand Down

0 comments on commit 9310eea

Please sign in to comment.