Browse Source

[DependencyInjection] refactored some exceptions

Johannes M. Schmitt 14 years ago
parent
commit
e624e27675

+ 11 - 3
src/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php

@@ -2,6 +2,8 @@
 
 namespace Symfony\Component\DependencyInjection\Compiler;
 
+use Symfony\Component\DependencyInjection\Exception\ScopeWideningException;
+use Symfony\Component\DependencyInjection\Exception\ScopeCrossingException;
 use Symfony\Component\DependencyInjection\Definition;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Reference;
@@ -126,7 +128,7 @@ class CheckReferenceValidityPass implements CompilerPassInterface
         $id = (string) $reference;
 
         if (in_array($scope, $this->currentScopeChildren, true)) {
-            throw new \RuntimeException(sprintf(
+            $ex = new ScopeWideningException(sprintf(
                 'Scope Widening Injection detected: The definition "%s" references the service "%s" which belongs to a narrower scope. '
                .'Generally, it is safer to either move "%s" to scope "%s" or alternatively rely on the provider pattern by injecting the container itself, and requesting the service "%s" each time it is needed. '
                .'In rare, special cases however that might not be necessary, then you can set the reference to strict=false to get rid of this error.',
@@ -136,11 +138,14 @@ class CheckReferenceValidityPass implements CompilerPassInterface
                $scope,
                $id
             ));
+            $ex->setServiceId($this->currentId);
+
+            throw $ex;
         }
 
         if (!in_array($scope, $this->currentScopeAncestors, true)) {
-            throw new \RuntimeException(sprintf(
-                'Cross-Scope Injection detected: The definition "%s" references the service "%s" which belongs to another scope hierarchy. '
+            $ex = new ScopeCrossingException(sprintf(
+                'Scope Crossing Injection detected: The definition "%s" references the service "%s" which belongs to another scope hierarchy. '
                .'This service might not be available consistently. Generally, it is safer to either move the definition "%s" to scope "%s", or '
                .'declare "%s" as a child scope of "%s". If you can be sure that the other scope is always active, you can set the reference to strict=false to get rid of this error.',
                $this->currentId,
@@ -150,6 +155,9 @@ class CheckReferenceValidityPass implements CompilerPassInterface
                $this->currentScope,
                $scope
             ));
+            $ex->setServiceId($this->currentId);
+
+            throw $ex;
         }
     }
 

+ 12 - 0
src/Symfony/Component/DependencyInjection/Exception/RuntimeException.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * Base RuntimeException for Dependency Injection Component.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class RuntimeException extends \RuntimeException implements Exception
+{
+}

+ 23 - 0
src/Symfony/Component/DependencyInjection/Exception/ScopeCrossingException.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * This exception is thrown when the a scope crossing injection is detected.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ScopeCrossingException extends RuntimeException
+{
+    private $serviceId;
+
+    public function setServiceId($id)
+    {
+        $this->serviceId = $id;
+    }
+
+    public function getServiceId()
+    {
+        return $this->serviceId;
+    }
+}

+ 23 - 0
src/Symfony/Component/DependencyInjection/Exception/ScopeWideningException.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace Symfony\Component\DependencyInjection\Exception;
+
+/**
+ * Thrown when a scope widening injection is detected.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ScopeWideningException extends RuntimeException
+{
+    private $serviceId;
+
+    public function setServiceId($id)
+    {
+        $this->serviceId = $id;
+    }
+
+    public function getServiceId()
+    {
+        return $this->serviceId;
+    }
+}