diff --git a/core/lib/Drupal/Component/Discovery/YamlDirectoryDiscovery.php b/core/lib/Drupal/Component/Discovery/YamlDirectoryDiscovery.php index ad70104..224c907 100644 --- a/core/lib/Drupal/Component/Discovery/YamlDirectoryDiscovery.php +++ b/core/lib/Drupal/Component/Discovery/YamlDirectoryDiscovery.php @@ -7,6 +7,7 @@ namespace Drupal\Component\Discovery; +use Drupal\Component\FileSystem\RegexDirectoryIterator; use Drupal\Component\Serialization\Exception\InvalidDataTypeException; use Drupal\Component\Serialization\Yaml; use Drupal\Component\FileCache\FileCacheFactory; @@ -17,6 +18,11 @@ class YamlDirectoryDiscovery implements DiscoverableInterface { /** + * Defines the key in the discovered data where the file path is stored. + */ + const DISCOVERY_PATH = '_discovery_path'; + + /** * An array of directories to scan, keyed by the provider. * * The value can either be a string or an array of strings. The string values @@ -86,6 +92,7 @@ public function findAll() { catch (InvalidDataTypeException $e) { throw new DiscoveryException("The $file contains invalid YAML", 0, $e); } + $data[static::DISCOVERY_PATH] = $file; $all[$provider][$this->getIdentifier($file, $data)] = $data; $file_cache->set($file, $data); } @@ -124,7 +131,7 @@ protected function findFiles() { $directories = (array) $directories; foreach ($directories as $directory) { if (is_dir($directory)) { - $files = new \RegexIterator(new \FilesystemIterator($directory), $pattern); + $files = new RegexDirectoryIterator($directory, $pattern); /** @var \SplFileInfo $fileInfo */ foreach ($files as $fileInfo) { $file_list[$fileInfo->getPathname()] = $provider; diff --git a/core/tests/Drupal/Tests/Component/Discovery/YamlDirectoryDiscoveryTest.php b/core/tests/Drupal/Tests/Component/Discovery/YamlDirectoryDiscoveryTest.php index a9827e0..0289e5f 100644 --- a/core/tests/Drupal/Tests/Component/Discovery/YamlDirectoryDiscoveryTest.php +++ b/core/tests/Drupal/Tests/Component/Discovery/YamlDirectoryDiscoveryTest.php @@ -76,18 +76,18 @@ public function testDiscovery() { $discovery = new YamlDirectoryDiscovery($directories, 'test'); $data = $discovery->findAll(); - $this->assertSame(['id' => 'item1', 'name' => 'test1 item 1'], $data['test_1']['item1']); - $this->assertSame(['id' => 'item2', 'name' => 'test1 item 2'], $data['test_1']['item2']); + $this->assertSame(['id' => 'item1', 'name' => 'test1 item 1', '_discovery_path' => 'vfs://modules/test_1/subdir1/item_1.test.yml'], $data['test_1']['item1']); + $this->assertSame(['id' => 'item2', 'name' => 'test1 item 2', '_discovery_path' => 'vfs://modules/test_1/subdir2/item_2.test.yml'], $data['test_1']['item2']); $this->assertCount(2, $data['test_1']); - $this->assertSame(['id' => 'item3', 'name' => 'test2 item 3'], $data['test_2']['item3']); + $this->assertSame(['id' => 'item3', 'name' => 'test2 item 3', '_discovery_path' => 'vfs://modules/test_2/subdir1/item_3.test.yml'], $data['test_2']['item3']); $this->assertCount(1, $data['test_2']); $this->assertTrue(empty($data['test_3']), 'test_3 provides 0 items'); - $this->assertSame(['id' => 'item4', 'name' => 'test4 item 4'], $data['test_4']['item4']); - $this->assertSame(['id' => 'item5', 'name' => 'test4 item 5'], $data['test_4']['item5']); - $this->assertSame(['id' => 'item6', 'name' => 'test4 item 6'], $data['test_4']['item6']); + $this->assertSame(['id' => 'item4', 'name' => 'test4 item 4', '_discovery_path' => 'vfs://modules/test_4/subdir1/item_4.test.yml'], $data['test_4']['item4']); + $this->assertSame(['id' => 'item5', 'name' => 'test4 item 5', '_discovery_path' => 'vfs://modules/test_4/subdir1/item_5.test.yml'], $data['test_4']['item5']); + $this->assertSame(['id' => 'item6', 'name' => 'test4 item 6', '_discovery_path' => 'vfs://modules/test_4/subdir1/item_6.test.yml'], $data['test_4']['item6']); $this->assertCount(3, $data['test_4']); } @@ -109,7 +109,7 @@ public function testDiscoveryAlternateId() { $discovery = new YamlDirectoryDiscovery($directories, 'test', 'alt_id'); $data = $discovery->findAll(); - $this->assertSame(['alt_id' => 'item1', 'id' => 'ignored'], $data['test_1']['item1']); + $this->assertSame(['alt_id' => 'item1', 'id' => 'ignored', '_discovery_path' => 'vfs://modules/test_1/item_1.test.yml'], $data['test_1']['item1']); $this->assertCount(1, $data['test_1']); } diff --git a/core/tests/Drupal/Tests/Core/Plugin/Discovery/YamlDirectoryDiscoveryTest.php b/core/tests/Drupal/Tests/Core/Plugin/Discovery/YamlDirectoryDiscoveryTest.php index ed07559..f057f55 100644 --- a/core/tests/Drupal/Tests/Core/Plugin/Discovery/YamlDirectoryDiscoveryTest.php +++ b/core/tests/Drupal/Tests/Core/Plugin/Discovery/YamlDirectoryDiscoveryTest.php @@ -7,6 +7,7 @@ namespace Drupal\Tests\Core\Plugin\Discovery; +use Drupal\Component\Discovery\YamlDirectoryDiscovery as ComponentYamlDirectoryDiscovery; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Tests\UnitTestCase; use Drupal\Core\Plugin\Discovery\YamlDirectoryDiscovery; @@ -60,7 +61,7 @@ public function testGetDefinitions() { $this->assertCount(4, $definitions); foreach ($definitions as $id => $definition) { - foreach (array('id', 'provider') as $key) { + foreach (array('id', 'provider', ComponentYamlDirectoryDiscovery::DISCOVERY_PATH) as $key) { $this->assertArrayHasKey($key, $definition); } $this->assertEquals($id, $definition['id']);