diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index f0460c1a85..fb85ecb869 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -12,6 +12,7 @@ namespace Symfony\Bundle\FrameworkBundle\DependencyInjection; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\DefinitionDecorator; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; @@ -372,6 +373,15 @@ class FrameworkExtension extends Extension if ($container->getParameter('kernel.debug')) { $loader->load('templating_debug.xml'); + $logger = new Reference('logger', ContainerInterface::IGNORE_ON_INVALID_REFERENCE); + + $container->getDefinition('templating.loader.cache') + ->addTag('monolog.logger', array('channel' => 'templating')) + ->addMethodCall('setLogger', array($logger)); + $container->getDefinition('templating.loader.chain') + ->addTag('monolog.logger', array('channel' => 'templating')) + ->addMethodCall('setLogger', array($logger)); + $container->setDefinition('templating.engine.php', $container->findDefinition('debug.templating.engine.php')); $container->setAlias('debug.templating.engine.php', 'templating.engine.php'); } diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/templating.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/templating.xml index b06c9af82f..59da78fc41 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/templating.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/templating.xml @@ -52,11 +52,9 @@ %templating.loader.cache.path% - - diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/templating_debug.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/templating_debug.xml index 23da774223..054a27b8cd 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/templating_debug.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/templating_debug.xml @@ -5,15 +5,10 @@ xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> - Symfony\Bundle\FrameworkBundle\Templating\Debugger Symfony\Bundle\FrameworkBundle\Templating\TimedPhpEngine - - - - diff --git a/src/Symfony/Bundle/FrameworkBundle/Templating/Debugger.php b/src/Symfony/Bundle/FrameworkBundle/Templating/Debugger.php index 19a59381d0..ff2d5edc4b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Templating/Debugger.php +++ b/src/Symfony/Bundle/FrameworkBundle/Templating/Debugger.php @@ -18,6 +18,8 @@ use Psr\Log\LoggerInterface; * Binds the Symfony templating loader debugger to the Symfony logger. * * @author Fabien Potencier + * + * @deprecated Deprecated in 2.4, to be removed in 3.0. Use Psr\Log\LoggerInterface instead. */ class Debugger implements DebuggerInterface { diff --git a/src/Symfony/Component/Templating/DebuggerInterface.php b/src/Symfony/Component/Templating/DebuggerInterface.php index 43026620ec..00d2947285 100644 --- a/src/Symfony/Component/Templating/DebuggerInterface.php +++ b/src/Symfony/Component/Templating/DebuggerInterface.php @@ -16,6 +16,8 @@ namespace Symfony\Component\Templating; * to debug template loader instances. * * @author Fabien Potencier + * + * @deprecated Deprecated in 2.4, to be removed in 3.0. Use Psr\Log\LoggerInterface instead. */ interface DebuggerInterface { diff --git a/src/Symfony/Component/Templating/Loader/CacheLoader.php b/src/Symfony/Component/Templating/Loader/CacheLoader.php index 3829bbbaad..832b3cb7b5 100644 --- a/src/Symfony/Component/Templating/Loader/CacheLoader.php +++ b/src/Symfony/Component/Templating/Loader/CacheLoader.php @@ -56,7 +56,10 @@ class CacheLoader extends Loader $path = $dir.DIRECTORY_SEPARATOR.$file; if (is_file($path)) { - if (null !== $this->debugger) { + if (null !== $this->logger) { + $this->logger->debug(sprintf('Fetching template "%s" from cache', $template->get('name'))); + } elseif (null !== $this->debugger) { + // just for BC, to be removed in 3.0 $this->debugger->log(sprintf('Fetching template "%s" from cache', $template->get('name'))); } @@ -75,7 +78,10 @@ class CacheLoader extends Loader file_put_contents($path, $content); - if (null !== $this->debugger) { + if (null !== $this->logger) { + $this->logger->debug(sprintf('Storing template "%s" in cache', $template->get('name'))); + } elseif (null !== $this->debugger) { + // just for BC, to be removed in 3.0 $this->debugger->log(sprintf('Storing template "%s" in cache', $template->get('name'))); } diff --git a/src/Symfony/Component/Templating/Loader/FilesystemLoader.php b/src/Symfony/Component/Templating/Loader/FilesystemLoader.php index 563010c6a6..08c2e6a9d9 100644 --- a/src/Symfony/Component/Templating/Loader/FilesystemLoader.php +++ b/src/Symfony/Component/Templating/Loader/FilesystemLoader.php @@ -63,20 +63,25 @@ class FilesystemLoader extends Loader $logs = array(); foreach ($this->templatePathPatterns as $templatePathPattern) { if (is_file($file = strtr($templatePathPattern, $replacements)) && is_readable($file)) { - if (null !== $this->debugger) { + if (null !== $this->logger) { + $this->logger->debug(sprintf('Loaded template file "%s"', $file)); + } elseif (null !== $this->debugger) { + // just for BC, to be removed in 3.0 $this->debugger->log(sprintf('Loaded template file "%s"', $file)); } return new FileStorage($file); } - if (null !== $this->debugger) { + if (null !== $this->logger || null !== $this->debugger) { $logs[] = sprintf('Failed loading template file "%s"', $file); } } - if (null !== $this->debugger) { - foreach ($logs as $log) { + foreach ($logs as $log) { + if (null !== $this->logger) { + $this->logger->debug($log); + } elseif (null !== $this->debugger) { $this->debugger->log($log); } } diff --git a/src/Symfony/Component/Templating/Loader/Loader.php b/src/Symfony/Component/Templating/Loader/Loader.php index 8fac1cce64..7239ac73d2 100644 --- a/src/Symfony/Component/Templating/Loader/Loader.php +++ b/src/Symfony/Component/Templating/Loader/Loader.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Templating\Loader; +use Psr\Log\LoggerInterface; use Symfony\Component\Templating\DebuggerInterface; /** @@ -20,12 +21,32 @@ use Symfony\Component\Templating\DebuggerInterface; */ abstract class Loader implements LoaderInterface { + /** + * @var LoggerInterface|null + */ + protected $logger; + + /** + * @deprecated Deprecated in 2.4, to be removed in 3.0. Use $this->logger instead. + */ protected $debugger; + /** + * Sets the debug logger to use for this loader. + * + * @param LoggerInterface $logger A logger instance + */ + public function setLogger(LoggerInterface $logger) + { + $this->logger = $logger; + } + /** * Sets the debugger to use for this loader. * * @param DebuggerInterface $debugger A debugger instance + * + * @deprecated Deprecated in 2.4, to be removed in 3.0. Use $this->setLogger() instead. */ public function setDebugger(DebuggerInterface $debugger) { diff --git a/src/Symfony/Component/Templating/Tests/Fixtures/ProjectTemplateDebugger.php b/src/Symfony/Component/Templating/Tests/Fixtures/ProjectTemplateDebugger.php deleted file mode 100644 index f414078eb2..0000000000 --- a/src/Symfony/Component/Templating/Tests/Fixtures/ProjectTemplateDebugger.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Templating\Tests\Fixtures; - -use Symfony\Component\Templating\DebuggerInterface; - -class ProjectTemplateDebugger implements DebuggerInterface -{ - protected $messages = array(); - - public function log($message) - { - $this->messages[] = $message; - } - - public function hasMessage($regex) - { - foreach ($this->messages as $message) { - if (preg_match('#'.preg_quote($regex, '#').'#', $message)) { - return true; - } - } - - return false; - } - - public function getMessages() - { - return $this->messages; - } -} diff --git a/src/Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.php b/src/Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.php index 6db7fecbff..b8b5f10e87 100644 --- a/src/Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.php +++ b/src/Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.php @@ -31,13 +31,19 @@ class CacheLoaderTest extends \PHPUnit_Framework_TestCase { $dir = sys_get_temp_dir().DIRECTORY_SEPARATOR.rand(111111, 999999); mkdir($dir, 0777, true); + $loader = new ProjectTemplateLoader($varLoader = new ProjectTemplateLoaderVar(new TemplateNameParser()), $dir); - $loader->setDebugger($debugger = new \Symfony\Component\Templating\Tests\Fixtures\ProjectTemplateDebugger()); $this->assertFalse($loader->load(new TemplateReference('foo', 'php')), '->load() returns false if the embed loader is not able to load the template'); + + $logger = $this->getMock('Psr\Log\LoggerInterface'); + $logger->expects($this->once())->method('debug')->with('Storing template "index" in cache'); + $loader->setLogger($logger); $loader->load(new TemplateReference('index')); - $this->assertTrue($debugger->hasMessage('Storing template'), '->load() logs a "Storing template" message if the template is found'); + + $logger = $this->getMock('Psr\Log\LoggerInterface'); + $logger->expects($this->once())->method('debug')->with('Fetching template "index" from cache'); + $loader->setLogger($logger); $loader->load(new TemplateReference('index')); - $this->assertTrue($debugger->hasMessage('Fetching template'), '->load() logs a "Storing template" message if the template is fetched from cache'); } } diff --git a/src/Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.php b/src/Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.php index 8eb663637d..74234808dd 100644 --- a/src/Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.php +++ b/src/Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.php @@ -59,15 +59,16 @@ class FilesystemLoaderTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf('Symfony\Component\Templating\Storage\FileStorage', $storage, '->load() returns a FileStorage if you pass a relative template that exists'); $this->assertEquals($path.'/foo.php', (string) $storage, '->load() returns a FileStorage pointing to the absolute path of the template'); + $logger = $this->getMock('Psr\Log\LoggerInterface'); + $logger->expects($this->exactly(2))->method('debug'); + $loader = new ProjectTemplateLoader2($pathPattern); - $loader->setDebugger($debugger = new \Symfony\Component\Templating\Tests\Fixtures\ProjectTemplateDebugger()); + $loader->setLogger($logger); $this->assertFalse($loader->load(new TemplateReference('foo.xml', 'php')), '->load() returns false if the template does not exist for the given engine'); - $this->assertTrue($debugger->hasMessage('Failed loading template'), '->load() logs a "Failed loading template" message if the template is not found'); $loader = new ProjectTemplateLoader2(array(self::$fixturesPath.'/null/%name%', $pathPattern)); - $loader->setDebugger($debugger = new \Symfony\Component\Templating\Tests\Fixtures\ProjectTemplateDebugger()); + $loader->setLogger($logger); $loader->load(new TemplateReference('foo.php', 'php')); - $this->assertTrue($debugger->hasMessage('Loaded template file'), '->load() logs a "Loaded template file" message if the template is found'); } } diff --git a/src/Symfony/Component/Templating/Tests/Loader/LoaderTest.php b/src/Symfony/Component/Templating/Tests/Loader/LoaderTest.php index 5964f59625..4be7ea94a7 100644 --- a/src/Symfony/Component/Templating/Tests/Loader/LoaderTest.php +++ b/src/Symfony/Component/Templating/Tests/Loader/LoaderTest.php @@ -17,11 +17,20 @@ use Symfony\Component\Templating\TemplateReferenceInterface; class LoaderTest extends \PHPUnit_Framework_TestCase { + public function testGetSetLogger() + { + $loader = new ProjectTemplateLoader4(new TemplateNameParser()); + $logger = $this->getMock('Psr\Log\LoggerInterface'); + $loader->setLogger($logger); + $this->assertSame($logger, $loader->getLogger(), '->setLogger() sets the logger instance'); + } + public function testGetSetDebugger() { $loader = new ProjectTemplateLoader4(new TemplateNameParser()); - $loader->setDebugger($debugger = new \Symfony\Component\Templating\Tests\Fixtures\ProjectTemplateDebugger()); - $this->assertTrue($loader->getDebugger() === $debugger, '->setDebugger() sets the debugger instance'); + $debugger = $this->getMock('Symfony\Component\Templating\DebuggerInterface'); + $loader->setDebugger($debugger); + $this->assertSame($debugger, $loader->getDebugger(), '->setDebugger() sets the debugger instance'); } } @@ -31,6 +40,11 @@ class ProjectTemplateLoader4 extends Loader { } + public function getLogger() + { + return $this->logger; + } + public function getDebugger() { return $this->debugger; diff --git a/src/Symfony/Component/Templating/composer.json b/src/Symfony/Component/Templating/composer.json index 1ea5697e43..b2b84d8aef 100644 --- a/src/Symfony/Component/Templating/composer.json +++ b/src/Symfony/Component/Templating/composer.json @@ -18,6 +18,12 @@ "require": { "php": ">=5.3.3" }, + "require-dev": { + "psr/log": "~1.0" + }, + "suggest": { + "psr/log": "For using debug logging in loaders" + }, "autoload": { "psr-0": { "Symfony\\Component\\Templating\\": "" } },