diff --git a/src/Helper/Url.php b/src/Helper/Url.php index 73d9cfdd4..f3e38e15a 100644 --- a/src/Helper/Url.php +++ b/src/Helper/Url.php @@ -103,7 +103,50 @@ public function __invoke($name = null, $params = [], $options = [], $reuseMatche $options['name'] = $name; - return $this->router->assemble($params, $options); + $e = null; + try { + return $this->router->assemble($params, $options); + } catch (\Zend\Router\Exception\InvalidArgumentException $e) { + // see below + } catch (\Zend\Router\Exception\RuntimeException $e) { + // see below + } catch (\Zend\Mvc\Router\Exception\InvalidArgumentException $e) { + // old zend v2 namespace - see below + } catch (\Zend\Mvc\Router\Exception\RuntimeException $e) { + // old zend v2 namespace - see below + } + switch (true) { + case $e instanceof \Zend\Router\Exception\InvalidArgumentException: + // Break intentionally omitted + case $e instanceof \Zend\Mvc\Router\Exception\InvalidArgumentException: + throw new Exception\InvalidArgumentException( + sprintf( + 'Couldnt create URL for route "%s", params "%s" and options "%s": %s', + $name, + json_encode($params), + json_encode($options), + $e->getMessage() + ), + $e->getCode(), + $e + ); + case $e instanceof \Zend\Router\Exception\RuntimeException: + // Break intentionally omitted + case $e instanceof \Zend\Mvc\Router\Exception\RuntimeException: + throw new Exception\RuntimeException( + sprintf( + 'Couldnt create URL for route "%s", params "%s" and options "%s": %s', + $name, + json_encode($params), + json_encode($options), + $e->getMessage() + ), + $e->getCode(), + $e + ); + default: + throw $e; + } } /** diff --git a/src/HelperPluginManager.php b/src/HelperPluginManager.php index ab45dc175..bfc4e6de0 100644 --- a/src/HelperPluginManager.php +++ b/src/HelperPluginManager.php @@ -153,7 +153,7 @@ class HelperPluginManager extends AbstractPluginManager Helper\Asset::class => Helper\Service\AssetFactory::class, Helper\FlashMessenger::class => Helper\Service\FlashMessengerFactory::class, Helper\Identity::class => Helper\Service\IdentityFactory::class, - Helper\BasePath::class => InvokableFactory::class, + Helper\BasePath::class => InvokableFactory::class, // overridden in ViewHelperManagerFactory Helper\Cycle::class => InvokableFactory::class, Helper\DeclareVars::class => InvokableFactory::class, Helper\Doctype::class => InvokableFactory::class, // overridden in ViewHelperManagerFactory @@ -184,7 +184,7 @@ class HelperPluginManager extends AbstractPluginManager Helper\RenderChildModel::class => InvokableFactory::class, Helper\RenderToPlaceholder::class => InvokableFactory::class, Helper\ServerUrl::class => InvokableFactory::class, - Helper\Url::class => InvokableFactory::class, + Helper\Url::class => InvokableFactory::class, // overridden in ViewHelperManagerFactory Helper\ViewModel::class => InvokableFactory::class, // v2 canonical FQCNs diff --git a/test/Helper/UrlTest.php b/test/Helper/UrlTest.php index 6a62bac48..a4a43b03f 100644 --- a/test/Helper/UrlTest.php +++ b/test/Helper/UrlTest.php @@ -256,4 +256,22 @@ public function testAcceptsNextGenRouteMatche() $url->setRouteMatch($routeMatch); $this->assertAttributeSame($routeMatch, 'routeMatch', $url); } + + public function testMissingParameter() + { + $this->expectException(Exception\InvalidArgumentException::class); + $this->expectExceptionMessage( + 'Couldnt create URL for route "default", params "[]" and options "{"name":"default"}"' + ); + $this->url->__invoke('default'); + } + + public function testUnknownSubroute() + { + $this->expectException(Exception\RuntimeException::class); + $this->expectExceptionMessage( + 'Couldnt create URL for route "does-not-exist", params "[]" and options "{"name":"does-not-exist"}"' + ); + $this->url->__invoke('does-not-exist'); + } }