Browse Source

ZF-7368: Chain route fails to match with an optional route at the end (patch by Kim Blomqvist)

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@23711 44c647ce-9c0f-0410-b52a-842ac1e357ba
intiilapa 15 years ago
parent
commit
277c85de19

+ 3 - 0
library/Zend/Controller/Router/Route.php

@@ -294,6 +294,9 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract
         foreach ($this->_variables as $var) {
             if (!array_key_exists($var, $return)) {
                 return false;
+            } elseif ($return[$var] == '' || $return[$var] === null) {
+                // Empty variable? Replace with the default value.
+                $return[$var] = $this->_defaults[$var];
             }
         }
 

+ 32 - 0
tests/Zend/Controller/Router/Route/ChainTest.php

@@ -783,6 +783,38 @@ class Zend_Controller_Router_Route_ChainTest extends PHPUnit_Framework_TestCase
         ), $values);
     }
 
+    /**
+     * @group ZF-7368
+     */
+    public function testChainingStaticDynamicMatchToDefaults()
+    {
+        $foo = new Zend_Controller_Router_Route_Static('foo');
+        $bar = new Zend_Controller_Router_Route(':bar', array('bar' => 0));
+        $chain = $foo->chain($bar);
+
+        $request = new Zend_Controller_Router_ChainTest_Request('http://www.zend.com/foo');
+        $res = $chain->match($request);
+
+        $this->assertType('array', $res, 'Route did not match');
+        $this->assertEquals(0, $res['bar']);
+    }
+
+    /**
+     * @group ZF-7368
+     */
+    public function testChainingStaticDynamicMatchToParams()
+    {
+        $foo = new Zend_Controller_Router_Route_Static('foo');
+        $bar = new Zend_Controller_Router_Route(':bar', array('bar' => 1));
+        $chain = $foo->chain($bar);
+
+        $request = new Zend_Controller_Router_ChainTest_Request('http://www.zend.com/foo/2');
+        $res = $chain->match($request);
+
+        $this->assertType('array', $res, 'Route did not match');
+        $this->assertEquals(2, $res['bar']);
+    }
+
     protected function _getRouter()
     {
         $router = new Zend_Controller_Router_Rewrite();