Bläddra i källkod

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'.
Fabien Potencier 14 år sedan
förälder
incheckning
9310eea57a

+ 0 - 15
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TemplatingPass.php

@@ -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));
-        }
     }
 }

+ 20 - 1
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

@@ -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',

+ 8 - 3
src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

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

+ 1 - 72
src/Symfony/Bundle/FrameworkBundle/Resources/config/templating.xml

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

+ 80 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/config/templating_php.xml

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

+ 2 - 7
src/Symfony/Bundle/FrameworkBundle/Templating/DelegatingEngine.php

@@ -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;
     }
 
     /**

+ 1 - 1
src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

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

+ 1 - 2
src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml

@@ -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" />