From 2ebcf66a1d93dcca2fc0748a5b1d4df2a3c63c5b Mon Sep 17 00:00:00 2001 From: Trent Steel Date: Tue, 24 Sep 2013 21:00:12 +1000 Subject: [PATCH 1/8] Prepend Child Bundle paths before the parent - fixes #9085 --- .../DependencyInjection/TwigExtension.php | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index e8fec8ddc43dc..f56e2f64f0c90 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -78,6 +78,20 @@ public function load(array $configs, ContainerBuilder $container) if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle); } + + if ($reflection->hasMethod('getParent')) { + $bundleInstance = $reflection->newInstance(); + + if (null !== $parentBundle = $bundleInstance->getParent()) { + if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) { + $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); + } + + if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { + $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); + } + } + } } if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/views')) { @@ -131,12 +145,27 @@ public function load(array $configs, ContainerBuilder $container) } private function addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle) + { + $name = $this->getShortBundleName($bundle); + + $twigFilesystemLoaderDefinition->addMethodCall('addPath', array($dir, $name)); + } + + private function prependTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle) + { + $name = $this->getShortBundleName($bundle); + + $twigFilesystemLoaderDefinition->addMethodCall('prependPath', array($dir, $name)); + } + + private function getShortBundleName($bundle) { $name = $bundle; if ('Bundle' === substr($name, -6)) { $name = substr($name, 0, -6); } - $twigFilesystemLoaderDefinition->addMethodCall('addPath', array($dir, $name)); + + return $name; } /** From db3a041de8562f5a5809943b461b1aa578680818 Mon Sep 17 00:00:00 2001 From: Trent Steel Date: Tue, 24 Sep 2013 21:07:46 +1000 Subject: [PATCH 2/8] reverse the other of the dirs as they are prepended --- .../Bundle/TwigBundle/DependencyInjection/TwigExtension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index f56e2f64f0c90..4b95ae3a946d2 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -83,11 +83,11 @@ public function load(array $configs, ContainerBuilder $container) $bundleInstance = $reflection->newInstance(); if (null !== $parentBundle = $bundleInstance->getParent()) { - if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) { + if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); } - if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { + if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) { $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); } } From 75686e6ca3a30123d8c00281e59fe23c7220173c Mon Sep 17 00:00:00 2001 From: Trent Steel Date: Tue, 24 Sep 2013 21:08:52 +1000 Subject: [PATCH 3/8] remove the prepended kernel root resources directory as you can just override the parent here --- .../Bundle/TwigBundle/DependencyInjection/TwigExtension.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index 4b95ae3a946d2..ade033291986e 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -86,10 +86,6 @@ public function load(array $configs, ContainerBuilder $container) if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); } - - if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) { - $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); - } } } } From a62debb34ee7a7f73a6d7830559842437dbe3446 Mon Sep 17 00:00:00 2001 From: Trent Steel Date: Wed, 25 Sep 2013 07:56:39 +1000 Subject: [PATCH 4/8] remove method check --- .../TwigBundle/DependencyInjection/TwigExtension.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index ade033291986e..ac9dbede2da98 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -79,13 +79,11 @@ public function load(array $configs, ContainerBuilder $container) $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle); } - if ($reflection->hasMethod('getParent')) { - $bundleInstance = $reflection->newInstance(); + $bundleInstance = $reflection->newInstance(); - if (null !== $parentBundle = $bundleInstance->getParent()) { - if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { - $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); - } + if (null !== $parentBundle = $bundleInstance->getParent()) { + if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { + $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); } } } From f3e8c6af8a06084ee13b8895602b9f3e01eeb4a4 Mon Sep 17 00:00:00 2001 From: Trent Steel Date: Wed, 25 Sep 2013 07:56:52 +1000 Subject: [PATCH 5/8] remove line break --- .../Bundle/TwigBundle/DependencyInjection/TwigExtension.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index ac9dbede2da98..3f5901599e6b1 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -80,7 +80,6 @@ public function load(array $configs, ContainerBuilder $container) } $bundleInstance = $reflection->newInstance(); - if (null !== $parentBundle = $bundleInstance->getParent()) { if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); From 59840e3b6000f52c2c09d3643646740f01e6f89b Mon Sep 17 00:00:00 2001 From: Trent Steel Date: Wed, 25 Sep 2013 08:29:31 +1000 Subject: [PATCH 6/8] add method to sort bundles by child first. remove the need for prepending. app Resources should always override child bundle resources. --- .../DependencyInjection/TwigExtension.php | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index 3f5901599e6b1..d194875a4800c 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -69,22 +69,25 @@ public function load(array $configs, ContainerBuilder $container) } // register bundles as Twig namespaces - foreach ($container->getParameter('kernel.bundles') as $bundle => $class) { - if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) { - $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle); - } + $bundles = $this->getBundlesByChildPriority($container); + foreach ($bundles as $bundle => $bundleReflection) { + if (null !== $parentBundle = $bundleReflection->newInstance()->getParent()) { + if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) { + $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle); + } - $reflection = new \ReflectionClass($class); - if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { - $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle); - } + if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$parentBundle.'/views')) { + $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); + } - $bundleInstance = $reflection->newInstance(); - if (null !== $parentBundle = $bundleInstance->getParent()) { - if (is_dir($dir = dirname($reflection->getFilename()).'/Resources/views')) { - $this->prependTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); + if (is_dir($dir = dirname($bundleReflection->getFilename()).'/Resources/views')) { + $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); } } + + if (is_dir($dir = dirname($bundleReflection->getFilename()).'/Resources/views')) { + $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle); + } } if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/views')) { @@ -137,28 +140,37 @@ public function load(array $configs, ContainerBuilder $container) )); } - private function addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle) + /** + * @param ContainerBuilder $container + * @return array | \ReflectionClass[] + */ + private function getBundlesByChildPriority(ContainerBuilder $container) { - $name = $this->getShortBundleName($bundle); + $childBundles = array(); + $parentBundles = array(); - $twigFilesystemLoaderDefinition->addMethodCall('addPath', array($dir, $name)); - } + foreach ($container->getParameter('kernel.bundles') as $bundle => $class) { + $reflection = new \ReflectionClass($class); - private function prependTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle) - { - $name = $this->getShortBundleName($bundle); + $bundleInstance = $reflection->newInstance(); + if (null === $parentBundle = $bundleInstance->getParent()) { + $parentBundles[$bundle] = $reflection; + } else { + $childBundles[$bundle] = $reflection; + } + } - $twigFilesystemLoaderDefinition->addMethodCall('prependPath', array($dir, $name)); + return array_merge($childBundles, $parentBundles); } - private function getShortBundleName($bundle) + private function addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle) { $name = $bundle; if ('Bundle' === substr($name, -6)) { $name = substr($name, 0, -6); } - return $name; + $twigFilesystemLoaderDefinition->addMethodCall('addPath', array($dir, $name)); } /** From bbb78d3187a42eebf848a417ee3d746bf469a010 Mon Sep 17 00:00:00 2001 From: Trent Steel Date: Wed, 25 Sep 2013 09:22:23 +1000 Subject: [PATCH 7/8] use getPath() from bundle instance. prepend child app Resource path to parent bundle namespace for consitency --- .../DependencyInjection/TwigExtension.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index d194875a4800c..c59eaa688ee16 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -71,21 +71,24 @@ public function load(array $configs, ContainerBuilder $container) // register bundles as Twig namespaces $bundles = $this->getBundlesByChildPriority($container); foreach ($bundles as $bundle => $bundleReflection) { - if (null !== $parentBundle = $bundleReflection->newInstance()->getParent()) { - if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) { - $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle); - } + /** @var \Symfony\Component\HttpKernel\Bundle\BundleInterface $bundleInstance */ + $bundleInstance = $bundleReflection->newInstance(); - if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$parentBundle.'/views')) { + if (null !== $parentBundle = $bundleInstance->getParent()) { + if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) { $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); } - if (is_dir($dir = dirname($bundleReflection->getFilename()).'/Resources/views')) { + if (is_dir($dir = $bundleInstance->getPath().'/Resources/views')) { $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $parentBundle); } } - if (is_dir($dir = dirname($bundleReflection->getFilename()).'/Resources/views')) { + if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$bundle.'/views')) { + $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle); + } + + if (is_dir($dir = $bundleInstance->getPath().'/Resources/views')) { $this->addTwigPath($twigFilesystemLoaderDefinition, $dir, $bundle); } } From 98fc66046df070df9390efc18b4c0f58638d3d4d Mon Sep 17 00:00:00 2001 From: Trent Steel Date: Wed, 25 Sep 2013 09:24:18 +1000 Subject: [PATCH 8/8] remove unused var --- .../Bundle/TwigBundle/DependencyInjection/TwigExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index c59eaa688ee16..f6ba7ab773f58 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -156,7 +156,7 @@ private function getBundlesByChildPriority(ContainerBuilder $container) $reflection = new \ReflectionClass($class); $bundleInstance = $reflection->newInstance(); - if (null === $parentBundle = $bundleInstance->getParent()) { + if (null === $bundleInstance->getParent()) { $parentBundles[$bundle] = $reflection; } else { $childBundles[$bundle] = $reflection;