Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 35a49fb

Browse files
feature #21408 [DI] Add ContainerBuilder::fileExists() for checking/tracking resource existence (chalasr)
This PR was merged into the 3.3-dev branch. Discussion ---------- [DI] Add ContainerBuilder::fileExists() for checking/tracking resource existence | Q | A | ------------- | --- | Branch? | master | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #20189, #20189 (comment) | License | MIT | Doc PR | n/a ~~Finishes #20189 Adds a convenient `ContainerBuilder::fileExists()` method as suggested by Nicolas and use it to track resources in the FrameworkExtension, adding some missing ones. Commits ------- 6b556b8 [DI] Add ContainerBuilder::fileExists()
2 parents 46daa35 + 6b556b8 commit 35a49fb

File tree

7 files changed

+77
-33
lines changed

7 files changed

+77
-33
lines changed

src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
use Symfony\Component\DependencyInjection\ContainerBuilder;
1515
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
16-
use Symfony\Component\Config\Resource\FileResource;
1716

1817
/**
1918
* Registers additional validators.
@@ -60,9 +59,8 @@ private function updateValidatorMappingFiles(ContainerBuilder $container, $mappi
6059

6160
foreach ($container->getParameter('kernel.bundles') as $bundle) {
6261
$reflection = new \ReflectionClass($bundle);
63-
if (is_file($file = dirname($reflection->getFileName()).'/'.$validationPath)) {
62+
if ($container->fileExists($file = dirname($reflection->getFileName()).'/'.$validationPath)) {
6463
$files[] = $file;
65-
$container->addResource(new FileResource($file));
6664
}
6765
}
6866

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
use Symfony\Component\DependencyInjection\Reference;
2525
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
2626
use Symfony\Component\Config\Resource\FileResource;
27-
use Symfony\Component\Config\Resource\DirectoryResource;
2827
use Symfony\Component\Finder\Finder;
2928
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
3029
use Symfony\Component\Config\FileLocator;
@@ -875,32 +874,28 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder
875874
}
876875
$rootDir = $container->getParameter('kernel.root_dir');
877876
foreach ($container->getParameter('kernel.bundles_metadata') as $name => $bundle) {
878-
if (is_dir($dir = $bundle['path'].'/Resources/translations')) {
877+
if ($container->fileExists($dir = $bundle['path'].'/Resources/translations')) {
879878
$dirs[] = $dir;
880879
}
881-
if (is_dir($dir = $rootDir.sprintf('/Resources/%s/translations', $name))) {
880+
if ($container->fileExists($dir = $rootDir.sprintf('/Resources/%s/translations', $name))) {
882881
$dirs[] = $dir;
883882
}
884883
}
885884

886885
foreach ($config['paths'] as $dir) {
887-
if (is_dir($dir)) {
886+
if ($container->fileExists($dir)) {
888887
$dirs[] = $dir;
889888
} else {
890889
throw new \UnexpectedValueException(sprintf('%s defined in translator.paths does not exist or is not a directory', $dir));
891890
}
892891
}
893892

894-
if (is_dir($dir = $rootDir.'/Resources/translations')) {
893+
if ($container->fileExists($dir = $rootDir.'/Resources/translations')) {
895894
$dirs[] = $dir;
896895
}
897896

898897
// Register translation resources
899898
if ($dirs) {
900-
foreach ($dirs as $dir) {
901-
$container->addResource(new DirectoryResource($dir));
902-
}
903-
904899
$files = array();
905900
$finder = Finder::create()
906901
->followLinks()
@@ -1006,19 +1001,16 @@ private function getValidatorMappingFiles(ContainerBuilder $container, array &$f
10061001
foreach ($container->getParameter('kernel.bundles_metadata') as $bundle) {
10071002
$dirname = $bundle['path'];
10081003

1009-
if (is_file($file = $dirname.'/Resources/config/validation.yml')) {
1004+
if ($container->fileExists($file = $dirname.'/Resources/config/validation.yml', false)) {
10101005
$files['yml'][] = $file;
1011-
$container->addResource(new FileResource($file));
10121006
}
10131007

1014-
if (is_file($file = $dirname.'/Resources/config/validation.xml')) {
1008+
if ($container->fileExists($file = $dirname.'/Resources/config/validation.xml', false)) {
10151009
$files['xml'][] = $file;
1016-
$container->addResource(new FileResource($file));
10171010
}
10181011

1019-
if (is_dir($dir = $dirname.'/Resources/config/validation')) {
1012+
if ($container->fileExists($dir = $dirname.'/Resources/config/validation')) {
10201013
$this->getValidatorMappingFilesFromDir($dir, $files);
1021-
$container->addResource(new DirectoryResource($dir));
10221014
}
10231015
}
10241016
}
@@ -1202,23 +1194,21 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
12021194
foreach ($container->getParameter('kernel.bundles_metadata') as $bundle) {
12031195
$dirname = $bundle['path'];
12041196

1205-
if (is_file($file = $dirname.'/Resources/config/serialization.xml')) {
1197+
if ($container->fileExists($file = $dirname.'/Resources/config/serialization.xml', false)) {
12061198
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array($file));
12071199
$definition->setPublic(false);
12081200

12091201
$serializerLoaders[] = $definition;
1210-
$container->addResource(new FileResource($file));
12111202
}
12121203

1213-
if (is_file($file = $dirname.'/Resources/config/serialization.yml')) {
1204+
if ($container->fileExists($file = $dirname.'/Resources/config/serialization.yml', false)) {
12141205
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array($file));
12151206
$definition->setPublic(false);
12161207

12171208
$serializerLoaders[] = $definition;
1218-
$container->addResource(new FileResource($file));
12191209
}
12201210

1221-
if (is_dir($dir = $dirname.'/Resources/config/serialization')) {
1211+
if ($container->fileExists($dir = $dirname.'/Resources/config/serialization')) {
12221212
foreach (Finder::create()->followLinks()->files()->in($dir)->name('*.xml') as $file) {
12231213
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array($file->getPathname()));
12241214
$definition->setPublic(false);
@@ -1231,8 +1221,6 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
12311221

12321222
$serializerLoaders[] = $definition;
12331223
}
1234-
1235-
$container->addResource(new DirectoryResource($dir));
12361224
}
12371225
}
12381226

src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace Symfony\Bundle\TwigBundle\DependencyInjection;
1313

1414
use Symfony\Component\Config\FileLocator;
15-
use Symfony\Component\Config\Resource\FileExistenceResource;
1615
use Symfony\Component\DependencyInjection\ContainerBuilder;
1716
use Symfony\Component\DependencyInjection\Reference;
1817
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
@@ -108,10 +107,9 @@ public function load(array $configs, ContainerBuilder $container)
108107
}
109108
}
110109

111-
if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/views')) {
110+
if ($container->fileExists($dir = $container->getParameter('kernel.root_dir').'/Resources/views', false)) {
112111
$twigFilesystemLoaderDefinition->addMethodCall('addPath', array($dir));
113112
}
114-
$container->addResource(new FileExistenceResource($dir));
115113

116114
if (!empty($config['globals'])) {
117115
$def = $container->getDefinition('twig');
@@ -164,15 +162,13 @@ private function getBundleHierarchy(ContainerBuilder $container)
164162
);
165163
}
166164

167-
if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$name.'/views')) {
165+
if ($container->fileExists($dir = $container->getParameter('kernel.root_dir').'/Resources/'.$name.'/views', false)) {
168166
$bundleHierarchy[$name]['paths'][] = $dir;
169167
}
170-
$container->addResource(new FileExistenceResource($dir));
171168

172-
if (is_dir($dir = $bundle['path'].'/Resources/views')) {
169+
if ($container->fileExists($dir = $bundle['path'].'/Resources/views', false)) {
173170
$bundleHierarchy[$name]['paths'][] = $dir;
174171
}
175-
$container->addResource(new FileExistenceResource($dir));
176172

177173
if (null === $bundle['parent']) {
178174
continue;

src/Symfony/Bundle/TwigBundle/composer.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"require-dev": {
2727
"symfony/asset": "~2.8|~3.0",
2828
"symfony/stopwatch": "~2.8|~3.0",
29-
"symfony/dependency-injection": "~2.8|~3.0",
29+
"symfony/dependency-injection": "~3.3",
3030
"symfony/expression-language": "~2.8|~3.0",
3131
"symfony/finder": "~2.8|~3.0",
3232
"symfony/form": "~2.8|~3.0",
@@ -36,6 +36,9 @@
3636
"symfony/framework-bundle": "^3.2.2",
3737
"doctrine/annotations": "~1.0"
3838
},
39+
"conflict": {
40+
"symfony/dependency-injection": "<3.3"
41+
},
3942
"autoload": {
4043
"psr-4": { "Symfony\\Bundle\\TwigBundle\\": "" },
4144
"exclude-from-classmap": [

src/Symfony/Component/DependencyInjection/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
3.3.0
55
-----
66

7+
* added `ContainerBuilder::fileExists()` for checking and tracking file or directory existence
78
* deprecated autowiring-types, use aliases instead
89
* [EXPERIMENTAL] added support for getter-injection
910
* added support for omitting the factory class name in a service definition if the definition class is set

src/Symfony/Component/DependencyInjection/ContainerBuilder.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
2626
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
2727
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
28+
use Symfony\Component\Config\Resource\DirectoryResource;
29+
use Symfony\Component\Config\Resource\FileExistenceResource;
2830
use Symfony\Component\Config\Resource\FileResource;
2931
use Symfony\Component\Config\Resource\ResourceInterface;
3032
use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\InstantiatorInterface;
@@ -1321,6 +1323,42 @@ public static function getServiceConditionals($value)
13211323
return $services;
13221324
}
13231325

1326+
/**
1327+
* Checks whether the requested file or directory exists and registers the result for resource tracking.
1328+
*
1329+
* @param string $path The file or directory path for which to check the existence
1330+
* @param bool|string $trackContents Whether to track contents of the given resource. If a string is passed,
1331+
* it will be used as pattern for tracking contents of the requested directory
1332+
*
1333+
* @return bool
1334+
*
1335+
* @final
1336+
*/
1337+
public function fileExists($path, $trackContents = true)
1338+
{
1339+
$exists = file_exists($path);
1340+
1341+
if (!$this->trackResources) {
1342+
return $exists;
1343+
}
1344+
1345+
if (!$exists) {
1346+
$this->addResource(new FileExistenceResource($path));
1347+
1348+
return $exists;
1349+
}
1350+
1351+
if ($trackContents) {
1352+
if (is_file($path)) {
1353+
$this->addResource(new FileResource($path));
1354+
} else {
1355+
$this->addResource(new DirectoryResource($path, is_string($trackContents) ? $trackContents : null));
1356+
}
1357+
}
1358+
1359+
return $exists;
1360+
}
1361+
13241362
/**
13251363
* Retrieves the currently set proxy instantiator or instantiates one.
13261364
*

src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
require_once __DIR__.'/Fixtures/includes/ProjectExtension.php';
1616

1717
use Symfony\Component\Config\Resource\ResourceInterface;
18+
use Symfony\Component\Config\Resource\DirectoryResource;
1819
use Symfony\Component\DependencyInjection\Alias;
1920
use Symfony\Component\DependencyInjection\Argument\ClosureProxyArgument;
2021
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
@@ -682,6 +683,25 @@ public function testResources()
682683
$this->assertEquals(array(), $container->getResources());
683684
}
684685

686+
public function testFileExists()
687+
{
688+
$container = new ContainerBuilder();
689+
$a = new FileResource(__DIR__.'/Fixtures/xml/services1.xml');
690+
$b = new FileResource(__DIR__.'/Fixtures/xml/services2.xml');
691+
$c = new DirectoryResource($dir = dirname($b));
692+
693+
$this->assertTrue($container->fileExists((string) $a) && $container->fileExists((string) $b) && $container->fileExists($dir));
694+
695+
$resources = array();
696+
foreach ($container->getResources() as $resource) {
697+
if (false === strpos($resource, '.php')) {
698+
$resources[] = $resource;
699+
}
700+
}
701+
702+
$this->assertEquals(array($a, $b, $c), $resources, '->getResources() returns an array of resources read for the current configuration');
703+
}
704+
685705
public function testExtension()
686706
{
687707
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)