From 85a1ddf46f8034407cfb880b67c3313f577f2ba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BChne?= Date: Thu, 14 Nov 2019 09:25:30 +0100 Subject: [PATCH 1/5] Catch Router exceptions and make them more verbose --- src/Helper/Url.php | 28 +++++++++++++++++++++++++++- src/HelperPluginManager.php | 4 ++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/Helper/Url.php b/src/Helper/Url.php index 73d9cfdd4..d707e3b4e 100644 --- a/src/Helper/Url.php +++ b/src/Helper/Url.php @@ -103,7 +103,33 @@ public function __invoke($name = null, $params = [], $options = [], $reuseMatche $options['name'] = $name; - return $this->router->assemble($params, $options); + try { + return $this->router->assemble($params, $options); + } catch (\Zend\Router\Exception\InvalidArgumentException $e) { + 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 + ); + } catch (\Zend\Router\Exception\RuntimeException $e) { + 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 + ); + } } /** 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 From f175019343ca2edd82df101648fcf48414d21bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BChne?= Date: Thu, 14 Nov 2019 09:47:26 +0100 Subject: [PATCH 2/5] Add test --- test/Helper/UrlTest.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/Helper/UrlTest.php b/test/Helper/UrlTest.php index 6a62bac48..2b3423195 100644 --- a/test/Helper/UrlTest.php +++ b/test/Helper/UrlTest.php @@ -256,4 +256,11 @@ public function testAcceptsNextGenRouteMatche() $url->setRouteMatch($routeMatch); $this->assertAttributeSame($routeMatch, 'routeMatch', $url); } + + public function testFailedRouterAssemble() + { + $this->expectException(Exception\InvalidArgumentException::class); + $this->expectExceptionMessage('Couldnt create URL for route "default", params "[]" and options "{"name":"default"}"'); + $this->url->__invoke('default'); + } } From 90dd3f99d8334493fc1aedceaec603da639e1097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BChne?= Date: Thu, 14 Nov 2019 10:21:22 +0100 Subject: [PATCH 3/5] Also catch Zend\Mvc\Router exceptions --- src/Helper/Url.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/Helper/Url.php b/src/Helper/Url.php index d707e3b4e..e1e45066d 100644 --- a/src/Helper/Url.php +++ b/src/Helper/Url.php @@ -117,6 +117,18 @@ public function __invoke($name = null, $params = [], $options = [], $reuseMatche $e->getCode(), $e ); + } catch (\Zend\Mvc\Router\Exception\InvalidArgumentException $e) { + 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 + ); } catch (\Zend\Router\Exception\RuntimeException $e) { throw new Exception\RuntimeException( sprintf( @@ -129,6 +141,18 @@ public function __invoke($name = null, $params = [], $options = [], $reuseMatche $e->getCode(), $e ); + } catch (\Zend\Mvc\Router\Exception\RuntimeException $e) { + 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 + ); } } From 70fdf591ff2971f6eb890454c3faf8eaa68bb0a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BChne?= Date: Thu, 14 Nov 2019 10:54:04 +0100 Subject: [PATCH 4/5] Fix CS of UrlTest --- test/Helper/UrlTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/Helper/UrlTest.php b/test/Helper/UrlTest.php index 2b3423195..be417e12c 100644 --- a/test/Helper/UrlTest.php +++ b/test/Helper/UrlTest.php @@ -260,7 +260,9 @@ public function testAcceptsNextGenRouteMatche() public function testFailedRouterAssemble() { $this->expectException(Exception\InvalidArgumentException::class); - $this->expectExceptionMessage('Couldnt create URL for route "default", params "[]" and options "{"name":"default"}"'); + $this->expectExceptionMessage( + 'Couldnt create URL for route "default", params "[]" and options "{"name":"default"}"' + ); $this->url->__invoke('default'); } } From addb71b097f34cff53b874ebebe4ea6b8b56a332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=BChne?= Date: Thu, 14 Nov 2019 12:18:52 +0100 Subject: [PATCH 5/5] Add more test cases, simplify exception-handling a bit --- src/Helper/Url.php | 83 +++++++++++++++++++---------------------- test/Helper/UrlTest.php | 11 +++++- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/src/Helper/Url.php b/src/Helper/Url.php index e1e45066d..f3e38e15a 100644 --- a/src/Helper/Url.php +++ b/src/Helper/Url.php @@ -103,56 +103,49 @@ public function __invoke($name = null, $params = [], $options = [], $reuseMatche $options['name'] = $name; + $e = null; try { return $this->router->assemble($params, $options); } catch (\Zend\Router\Exception\InvalidArgumentException $e) { - 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 - ); - } catch (\Zend\Mvc\Router\Exception\InvalidArgumentException $e) { - 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 - ); + // see below } catch (\Zend\Router\Exception\RuntimeException $e) { - 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 - ); + // see below + } catch (\Zend\Mvc\Router\Exception\InvalidArgumentException $e) { + // old zend v2 namespace - see below } catch (\Zend\Mvc\Router\Exception\RuntimeException $e) { - 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 - ); + // 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/test/Helper/UrlTest.php b/test/Helper/UrlTest.php index be417e12c..a4a43b03f 100644 --- a/test/Helper/UrlTest.php +++ b/test/Helper/UrlTest.php @@ -257,7 +257,7 @@ public function testAcceptsNextGenRouteMatche() $this->assertAttributeSame($routeMatch, 'routeMatch', $url); } - public function testFailedRouterAssemble() + public function testMissingParameter() { $this->expectException(Exception\InvalidArgumentException::class); $this->expectExceptionMessage( @@ -265,4 +265,13 @@ public function testFailedRouterAssemble() ); $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'); + } }