From 9b97b51f0c1b00934999f81b6a7f4a4d217a7aa9 Mon Sep 17 00:00:00 2001 From: Mateusz Tymek Date: Tue, 14 Jan 2014 20:20:01 +0100 Subject: [PATCH] update console route regexps --- library/Zend/Mvc/Router/Console/Simple.php | 162 +++++++++--------- .../Mvc/Router/Console/SimpleTest.php | 39 +++++ 2 files changed, 120 insertions(+), 81 deletions(-) diff --git a/library/Zend/Mvc/Router/Console/Simple.php b/library/Zend/Mvc/Router/Console/Simple.php index 14e2c91fe11..b728100d5a4 100644 --- a/library/Zend/Mvc/Router/Console/Simple.php +++ b/library/Zend/Mvc/Router/Console/Simple.php @@ -189,12 +189,90 @@ protected function parseRouteDefinition($def) $unnamedGroupCounter = 1; while ($pos < $length) { + /** + * Optional value param, i.e. + * [SOMETHING] + */ + if (preg_match('/\G\[(?P[A-Z][A-Z0-9\_\-]*?)\](?: +|$)/s', $def, $m, 0, $pos)) { + $item = array( + 'name' => strtolower($m['name']), + 'literal' => false, + 'required' => false, + 'positional' => true, + 'hasValue' => true, + ); + } + /** + * Mandatory value param, i.e. + * SOMETHING + */ + elseif (preg_match('/\G(?P[A-Z][A-Z0-9\_\-]*?)(?: +|$)/s', $def, $m, 0, $pos)) { + $item = array( + 'name' => strtolower($m['name']), + 'literal' => false, + 'required' => true, + 'positional' => true, + 'hasValue' => true, + ); + } + /** + * Optional literal param, i.e. + * [something] + */ + elseif (preg_match('/\G\[ *?(?P[a-zA-Z][a-zA-Z0-9\_\-]*?) *?\](?: +|$)/s', $def, $m, 0, $pos)) { + $item = array( + 'name' => $m['name'], + 'literal' => true, + 'required' => false, + 'positional' => true, + 'hasValue' => false, + ); + } + /** + * Optional value param, syntax 2, i.e. + * [] + */ + elseif (preg_match('/\G\[ *\<(?P[a-zA-Z][a-zA-Z0-9\_\-]*?)\> *\](?: +|$)/s', $def, $m, 0, $pos)) { + $item = array( + 'name' => strtolower($m['name']), + 'literal' => false, + 'required' => false, + 'positional' => true, + 'hasValue' => true, + ); + } + /** + * Mandatory value param, i.e. + * + */ + elseif (preg_match('/\G\< *(?P[a-zA-Z][a-zA-Z0-9\_\-]*?) *\>(?: +|$)/s', $def, $m, 0, $pos)) { + $item = array( + 'name' => $m['name'], + 'literal' => false, + 'required' => true, + 'positional' => true, + 'hasValue' => true, + ); + } + /** + * Mandatory literal param, i.e. + * something + */ + elseif (preg_match('/\G(?P[a-zA-Z][a-zA-Z0-9\_\-]*?)(?: +|$)/s', $def, $m, 0, $pos)) { + $item = array( + 'name' => $m['name'], + 'literal' => true, + 'required' => true, + 'positional' => true, + 'hasValue' => false, + ); + } /** * Mandatory long param * --param= * --param=whatever */ - if (preg_match('/\G--(?P[a-zA-Z0-9][a-zA-Z0-9\_\-]+)(?P=\S*?)?(?: +|$)/s', $def, $m, 0, $pos)) { + elseif (preg_match('/\G--(?P[a-zA-Z0-9][a-zA-Z0-9\_\-]+)(?P=\S*?)?(?: +|$)/s', $def, $m, 0, $pos)) { $item = array( 'name' => $m['name'], 'short' => false, @@ -281,7 +359,7 @@ protected function parseRouteDefinition($def) (?P (?: \ *? - (?P[a-z0-9][a-zA-Z0-9_\-]*?) + (?P[a-zA-Z][a-zA-Z0-9_\-]*?) \ *? (?:\||(?=\])) \ *? @@ -321,7 +399,7 @@ protected function parseRouteDefinition($def) (?P (?: \ *? - (?P[a-z0-9][a-zA-Z0-9_\-]+) + (?P[a-zA-Z][a-zA-Z0-9_\-]+) \ *? (?:\||(?=\))) \ *? @@ -433,84 +511,6 @@ protected function parseRouteDefinition($def) 'alternatives' => $options, 'hasValue' => false, ); - } - /** - * Optional literal param, i.e. - * [something] - */ - elseif (preg_match('/\G\[ *?(?P[a-z0-9][a-zA-Z0-9\_\-]*?) *?\](?: +|$)/s', $def, $m, 0, $pos)) { - $item = array( - 'name' => $m['name'], - 'literal' => true, - 'required' => false, - 'positional' => true, - 'hasValue' => false, - ); - } - /** - * Optional value param, i.e. - * [SOMETHING] - */ - elseif (preg_match('/\G\[(?P[a-z0-9][a-zA-Z0-9\_\-]*?)\](?: +|$)/s', $def, $m, 0, $pos)) { - $item = array( - 'name' => strtolower($m['name']), - 'literal' => false, - 'required' => false, - 'positional' => true, - 'hasValue' => true, - ); - } - /** - * Optional value param, syntax 2, i.e. - * [] - */ - elseif (preg_match('/\G\[ *\<(?P[a-z0-9][a-zA-Z0-9\_\-]*?)\> *\](?: +|$)/s', $def, $m, 0, $pos)) { - $item = array( - 'name' => strtolower($m['name']), - 'literal' => false, - 'required' => false, - 'positional' => true, - 'hasValue' => true, - ); - } - /** - * Mandatory value param, i.e. - * - */ - elseif (preg_match('/\G\< *(?P[a-z0-9][a-zA-Z0-9\_\-]*?) *\>(?: +|$)/s', $def, $m, 0, $pos)) { - $item = array( - 'name' => $m['name'], - 'literal' => false, - 'required' => true, - 'positional' => true, - 'hasValue' => true, - ); - } - /** - * Mandatory value param, i.e. - * SOMETHING - */ - elseif (preg_match('/\G(?P[A-Z][a-zA-Z0-9\_\-]*?)(?: +|$)/s', $def, $m, 0, $pos)) { - $item = array( - 'name' => strtolower($m['name']), - 'literal' => false, - 'required' => true, - 'positional' => true, - 'hasValue' => true, - ); - } - /** - * Mandatory literal param, i.e. - * something - */ - elseif (preg_match('/\G(?P[a-z0-9][a-zA-Z0-9\_\-]*?)(?: +|$)/s', $def, $m, 0, $pos)) { - $item = array( - 'name' => $m['name'], - 'literal' => true, - 'required' => true, - 'positional' => true, - 'hasValue' => false, - ); } else { throw new Exception\InvalidArgumentException( 'Cannot understand Console route at "' . substr($def, $pos) . '"' diff --git a/tests/ZendTest/Mvc/Router/Console/SimpleTest.php b/tests/ZendTest/Mvc/Router/Console/SimpleTest.php index 0f7a4272a4d..aeda76ac95f 100644 --- a/tests/ZendTest/Mvc/Router/Console/SimpleTest.php +++ b/tests/ZendTest/Mvc/Router/Console/SimpleTest.php @@ -841,6 +841,45 @@ public static function routeProvider() ) ), + /** + * @bug ZF2-5671 + * @link https://github.com/zendframework/zf2/issues/5671 + */ + 'mandatory-literal-camel-case' => array( + 'FooBar', + array('FooBar'), + array(), + ), + 'mandatory-literal-camel-case-no-match' => array( + 'FooBar', + array('foobar'), + null, + ), + 'optional-literal-camel-case' => array( + '[FooBar]', + array('FooBar'), + array(), + ), + 'optional-literal-camel-case-no-match' => array( + '[FooBar]', + array('foobar'), + null, + ), + 'optional-literal-alternative-camel-case' => array( + '[ FooBar | FoozBar ]', + array('FooBar'), + array(), + ), + 'required-literal-alternative-camel-case' => array( + '( FooBar | FoozBar )', + array('FooBar'), + array(), + ), + 'required-literal-alternative-camel-case-no-match' => array( + '( FooBar | FoozBar )', + array('baz'), + null, + ), ); }