Sfoglia il codice sorgente

[DependencyInjection] Adding to InvalidArgumentException messages to clarify when a service is given an invalid "tags" value.

Ryan Weaver 14 anni fa
parent
commit
c5e4dfb5a6

+ 8 - 0
src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php

@@ -239,7 +239,15 @@ class YamlFileLoader extends FileLoader
         }
 
         if (isset($service['tags'])) {
+            if (!is_array($service['tags'])) {
+                throw new \InvalidArgumentException(sprintf('Parameter "tags" must be an array for service "%s" in %s.', $id, $file));
+            }
+
             foreach ($service['tags'] as $tag) {
+                if (!isset($tag['name'])) {
+                    throw new \InvalidArgumentException(sprintf('A "tags" entry is missing a "name" key must be an array for service "%s" in %s.', $id, $file));
+                }
+
                 $name = $tag['name'];
                 unset($tag['name']);
 

+ 5 - 0
tests/Symfony/Tests/Component/DependencyInjection/Fixtures/yaml/badtag1.yml

@@ -0,0 +1,5 @@
+services:
+    foo_service:
+        class:    FooClass
+        # tags is not an array
+        tags:     string

+ 6 - 0
tests/Symfony/Tests/Component/DependencyInjection/Fixtures/yaml/badtag2.yml

@@ -0,0 +1,6 @@
+services:
+    foo_service:
+        class:    FooClass
+        tags:
+          # tag is missing the name key
+          foo_tag:   { foo: bar }

+ 24 - 0
tests/Symfony/Tests/Component/DependencyInjection/Loader/YamlFileLoaderTest.php

@@ -166,6 +166,30 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
         $interface = $interfaces['FooClass'];
         $this->assertTrue($interface->hasMethodCall('setBar'), '->load() parses interfaces elements');
     }
+
+    public function testNonArrayTagThrowsException()
+    {
+        $loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/yaml'));
+        try {
+            $loader->load('badtag1.yml');
+            $this->fail('->load() should throw an exception when the tags key of a service is not an array');
+        } catch (\Exception $e) {
+            $this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the tags key is not an array');
+            $this->assertStringStartsWith('Parameter "tags" must be an array for service', $e->getMessage(), '->load() throws an InvalidArgumentException if the tags key is not an array');
+        }
+    }
+
+    public function testTagWithoutNameThrowsException()
+    {
+        $loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/yaml'));
+        try {
+            $loader->load('badtag2.yml');
+            $this->fail('->load() should throw an exception when a tag is missing the name key');
+        } catch (\Exception $e) {
+            $this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if a tag is missing the name key');
+            $this->assertStringStartsWith('A "tags" entry is missing a "name" key must be an array for service ', $e->getMessage(), '->load() throws an InvalidArgumentException if a tag is missing the name key');
+        }
+    }
 }
 
 class ProjectLoader3 extends YamlFileLoader