added a more specialized exception for a better error message

This commit is contained in:
Fabien Potencier 2017-04-11 13:42:20 -07:00
parent 7b8409ad37
commit aeb9bffa8f
7 changed files with 27 additions and 7 deletions

View File

@ -64,7 +64,7 @@ class DelegatingLoader extends BaseDelegatingLoader
// - this handles the case and prevents the second fatal error
// by triggering an exception beforehand.
throw new FileLoaderLoadException($resource);
throw new FileLoaderLoadException($resource, null, null, null, $type);
}
$this->loading = true;

View File

@ -23,8 +23,9 @@ class FileLoaderLoadException extends \Exception
* @param string $sourceResource The original resource importing the new resource
* @param int $code The error code
* @param \Exception $previous A previous exception
* @param string $type The type of resource
*/
public function __construct($resource, $sourceResource = null, $code = null, $previous = null)
public function __construct($resource, $sourceResource = null, $code = null, $previous = null, $type = null)
{
$message = '';
if ($previous) {
@ -60,6 +61,13 @@ class FileLoaderLoadException extends \Exception
$bundle = substr($parts[0], 1);
$message .= sprintf(' Make sure the "%s" bundle is correctly registered and loaded in the application kernel class.', $bundle);
$message .= sprintf(' If the bundle is registered, make sure the bundle path "%s" is not empty.', $resource);
} elseif (null !== $type) {
// maybe there is no loader for this specific type
if ('annotation' === $type) {
$message .= ' Make sure annotations are enabled.';
} else {
$message .= sprintf(' Make sure there is a loader supporting the "%s" type.', $type);
}
}
parent::__construct($message, $code, $previous);

View File

@ -39,7 +39,7 @@ class DelegatingLoader extends Loader
public function load($resource, $type = null)
{
if (false === $loader = $this->resolver->resolve($resource, $type)) {
throw new FileLoaderLoadException($resource);
throw new FileLoaderLoadException($resource, null, null, null, $type);
}
return $loader->load($resource, $type);

View File

@ -210,7 +210,7 @@ abstract class FileLoader extends Loader
throw $e;
}
throw new FileLoaderLoadException($resource, $sourceResource, null, $e);
throw new FileLoaderLoadException($resource, $sourceResource, null, $e, $type);
}
}
}

View File

@ -70,7 +70,7 @@ abstract class Loader implements LoaderInterface
$loader = null === $this->resolver ? false : $this->resolver->resolve($resource, $type);
if (false === $loader) {
throw new FileLoaderLoadException($resource);
throw new FileLoaderLoadException($resource, null, null, null, $type);
}
return $loader;

View File

@ -22,6 +22,18 @@ class FileLoaderLoadExceptionTest extends TestCase
$this->assertEquals('Cannot load resource "resource".', $exception->getMessage());
}
public function testMessageCannotLoadResourceWithType()
{
$exception = new FileLoaderLoadException('resource', null, null, null, 'foobar');
$this->assertEquals('Cannot load resource "resource". Make sure there is a loader supporting the "foobar" type.', $exception->getMessage());
}
public function testMessageCannotLoadResourceWithAnnotationType()
{
$exception = new FileLoaderLoadException('resource', null, null, null, 'annotation');
$this->assertEquals('Cannot load resource "resource". Make sure annotations are enabled.', $exception->getMessage());
}
public function testMessageCannotImportResourceFromSource()
{
$exception = new FileLoaderLoadException('resource', 'sourceResource');

View File

@ -369,11 +369,11 @@ class RouteCollectionBuilder
}
if (null === $resolver = $this->loader->getResolver()) {
throw new FileLoaderLoadException($resource);
throw new FileLoaderLoadException($resource, null, null, null, $type);
}
if (false === $loader = $resolver->resolve($resource, $type)) {
throw new FileLoaderLoadException($resource);
throw new FileLoaderLoadException($resource, null, null, null, $type);
}
$collections = $loader->load($resource, $type);