Ver código fonte

made PHP renderer optional in Templating

Fabien Potencier 14 anos atrás
pai
commit
bc2ca8f1cf

+ 5 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/config/templating.xml

@@ -22,6 +22,7 @@
         <parameter key="templating.assets.version">null</parameter>
         <parameter key="templating.assets.version">null</parameter>
         <parameter key="templating.assets.base_urls" type="collection"></parameter>
         <parameter key="templating.assets.base_urls" type="collection"></parameter>
         <parameter key="templating.name_converter.class">Symfony\Bundle\FrameworkBundle\Templating\TemplateNameConverter</parameter>
         <parameter key="templating.name_converter.class">Symfony\Bundle\FrameworkBundle\Templating\TemplateNameConverter</parameter>
+        <parameter key="templating.renderer.php.class">Symfony\Component\Templating\Renderer\PhpRenderer</parameter>
         <parameter key="debug.file_link_format">null</parameter>
         <parameter key="debug.file_link_format">null</parameter>
     </parameters>
     </parameters>
 
 
@@ -103,6 +104,10 @@
             <argument type="service" id="service_container" />
             <argument type="service" id="service_container" />
         </service>
         </service>
 
 
+        <service id="templating.renderer.php" class="%templating.renderer.php.class%">
+            <tag name="templating.renderer" alias="php" />
+        </service>
+
         <service id="templating.loader" alias="templating.loader.filesystem" />
         <service id="templating.loader" alias="templating.loader.filesystem" />
 
 
         <service id="templating" alias="templating.engine" />
         <service id="templating" alias="templating.engine" />

+ 6 - 12
src/Symfony/Component/Templating/Engine.php

@@ -3,7 +3,6 @@
 namespace Symfony\Component\Templating;
 namespace Symfony\Component\Templating;
 
 
 use Symfony\Component\Templating\Loader\LoaderInterface;
 use Symfony\Component\Templating\Loader\LoaderInterface;
-use Symfony\Component\Templating\Renderer\PhpRenderer;
 use Symfony\Component\Templating\Renderer\RendererInterface;
 use Symfony\Component\Templating\Renderer\RendererInterface;
 use Symfony\Component\Templating\Helper\HelperInterface;
 use Symfony\Component\Templating\Helper\HelperInterface;
 
 
@@ -38,8 +37,8 @@ class Engine implements \ArrayAccess
     /**
     /**
      * Constructor.
      * Constructor.
      *
      *
-     * @param LoaderInterface $loader    A loader instance
-     * @param array           $helpers   A array of helper instances
+     * @param LoaderInterface $loader  A loader instance
+     * @param array           $helpers An array of helper instances
      */
      */
     public function __construct(LoaderInterface $loader, array $helpers = array())
     public function __construct(LoaderInterface $loader, array $helpers = array())
     {
     {
@@ -50,11 +49,11 @@ class Engine implements \ArrayAccess
         $this->charset   = 'UTF-8';
         $this->charset   = 'UTF-8';
         $this->cache     = array();
         $this->cache     = array();
         $this->globals   = array();
         $this->globals   = array();
+        $this->renderers = array();
 
 
         $this->addHelpers($helpers);
         $this->addHelpers($helpers);
 
 
         $this->initializeEscapers();
         $this->initializeEscapers();
-
         foreach ($this->escapers as $context => $escaper) {
         foreach ($this->escapers as $context => $escaper) {
             $this->setEscaper($context, $escaper);
             $this->setEscaper($context, $escaper);
         }
         }
@@ -62,14 +61,9 @@ class Engine implements \ArrayAccess
 
 
     public function setRenderers(array $renderers = array())
     public function setRenderers(array $renderers = array())
     {
     {
-        $this->renderers = $renderers;
-
-        if (!isset($this->renderers['php'])) {
-            $this->renderers['php'] = new PhpRenderer();
-        }
-
-        foreach ($this->renderers as $renderer) {
-            $renderer->setEngine($this);
+        $this->renderers = array();
+        foreach ($renderers as $name => $renderer) {
+            $this->setRenderer($name, $renderer);
         }
         }
     }
     }
 
 

+ 7 - 8
tests/Symfony/Tests/Component/Templating/EngineTest.php

@@ -41,12 +41,8 @@ class EngineTest extends \PHPUnit_Framework_TestCase
     {
     {
         $engine = new ProjectTemplateEngine(self::$loader);
         $engine = new ProjectTemplateEngine(self::$loader);
         $engine->setRenderers(array('foo' => self::$renderer));
         $engine->setRenderers(array('foo' => self::$renderer));
-        $this->assertEquals(array('foo', 'php'), array_keys($engine->getRenderers()), '__construct() takes an array of renderers as its third argument');
-        $this->assertTrue(self::$renderer->getEngine() === $engine, '__construct() registers itself on all renderers');
-
-        $engine = new ProjectTemplateEngine(self::$loader);
-        $engine->setRenderers(array('php' => self::$renderer));
-        $this->assertTrue($engine->getRenderers() === array('php' => self::$renderer), '__construct() can overridde the default PHP renderer');
+        $this->assertEquals(array('foo'), array_keys($engine->getRenderers()));
+        $this->assertTrue(self::$renderer->getEngine() === $engine, 'setRenderers() registers itself on all renderers');
     }
     }
 
 
     public function testOffsetGet()
     public function testOffsetGet()
@@ -106,13 +102,15 @@ class EngineTest extends \PHPUnit_Framework_TestCase
             $this->assertEquals('The template "foo:name" does not exist (renderer: name).', $e->getMessage(), '->render() throws an InvalidArgumentException if no renderer is registered for the given renderer');
             $this->assertEquals('The template "foo:name" does not exist (renderer: name).', $e->getMessage(), '->render() throws an InvalidArgumentException if no renderer is registered for the given renderer');
         }
         }
 
 
-        $engine = new ProjectTemplateEngine(self::$loader, array(), array(new SlotsHelper()));
+        $engine = new ProjectTemplateEngine(self::$loader, array(new SlotsHelper()));
+        $engine->setRenderer('php', new PhpRenderer());
         $engine->set(new \SimpleHelper('bar'));
         $engine->set(new \SimpleHelper('bar'));
         self::$loader->setTemplate('foo.php', '<?php $view->extend("layout"); echo $view[\'foo\'].$foo ?>');
         self::$loader->setTemplate('foo.php', '<?php $view->extend("layout"); echo $view[\'foo\'].$foo ?>');
         self::$loader->setTemplate('layout.php', '-<?php echo $view[\'slots\']->get("_content") ?>-');
         self::$loader->setTemplate('layout.php', '-<?php echo $view[\'slots\']->get("_content") ?>-');
         $this->assertEquals('-barfoo-', $engine->render('foo', array('foo' => 'foo')), '->render() uses the decorator to decorate the template');
         $this->assertEquals('-barfoo-', $engine->render('foo', array('foo' => 'foo')), '->render() uses the decorator to decorate the template');
 
 
-        $engine = new ProjectTemplateEngine(self::$loader, array(), array(new SlotsHelper()));
+        $engine = new ProjectTemplateEngine(self::$loader, array(new SlotsHelper()));
+        $engine->setRenderer('php', new PhpRenderer());
         $engine->set(new \SimpleHelper('bar'));
         $engine->set(new \SimpleHelper('bar'));
         self::$loader->setTemplate('bar.php', 'bar');
         self::$loader->setTemplate('bar.php', 'bar');
         self::$loader->setTemplate('foo.php', '<?php $view->extend("layout"); echo $foo ?>');
         self::$loader->setTemplate('foo.php', '<?php $view->extend("layout"); echo $foo ?>');
@@ -149,6 +147,7 @@ class EngineTest extends \PHPUnit_Framework_TestCase
     public function testGlobalsGetPassedToTemplate()
     public function testGlobalsGetPassedToTemplate()
     {
     {
         $engine = new ProjectTemplateEngine(self::$loader);
         $engine = new ProjectTemplateEngine(self::$loader);
+        $engine->setRenderer('php', new PhpRenderer());
         $engine->addGlobal('global', 'global variable');
         $engine->addGlobal('global', 'global variable');
 
 
         self::$loader->setTemplate('global.php', '<?php echo $global; ?>');
         self::$loader->setTemplate('global.php', '<?php echo $global; ?>');