Преглед изворни кода

Merge r25248 to 1.12 release branch

git-svn-id: http://framework.zend.com/svn/framework/standard/branches/release-1.12@25249 44c647ce-9c0f-0410-b52a-842ac1e357ba
frosch пре 13 година
родитељ
комит
e2b92a535b

+ 49 - 7
library/Zend/Controller/Router/Route/Chain.php

@@ -39,7 +39,8 @@ class Zend_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Ab
     /**
      * Instantiates route based on passed Zend_Config structure
      *
-     * @param Zend_Config $config Configuration object
+     * @param  Zend_Config $config Configuration object
+     * @return Zend_Controller_Router_Route_Chain
      */
     public static function getInstance(Zend_Config $config)
     {
@@ -68,14 +69,16 @@ class Zend_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Ab
      * Assigns and returns an array of defaults on a successful match.
      *
      * @param  Zend_Controller_Request_Http $request Request to get the path info from
+     * @param  null                         $partial
      * @return array|false An array of assigned values or a false on a mismatch
      */
     public function match($request, $partial = null)
     {
-        $path      = trim($request->getPathInfo(), self::URI_DELIMITER);
-        $subPath   = $path;
-        $values    = array();
-        $numRoutes = count($this->_routes);
+        $path        = trim($request->getPathInfo(), self::URI_DELIMITER);
+        $subPath     = $path;
+        $values      = array();
+        $numRoutes   = count($this->_routes);
+        $matchedPath = null;
 
         foreach ($this->_routes as $key => $route) {
             if ($key > 0
@@ -127,7 +130,9 @@ class Zend_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Ab
     /**
      * Assembles a URL path defined by this route
      *
-     * @param array $data An array of variable and value pairs used as parameters
+     * @param  array $data An array of variable and value pairs used as parameters
+     * @param  bool  $reset
+     * @param  bool  $encode
      * @return string Route path with user submitted parameters
      */
     public function assemble($data = array(), $reset = false, $encode = false)
@@ -170,5 +175,42 @@ class Zend_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Ab
             }
         }
     }
+    
+    /**
+     * Return a single parameter of route's defaults
+     *
+     * @param  string $name Array key of the parameter
+     * @return string Previously set default
+     */
+    public function getDefault($name)
+    {
+        $default = null;
+        foreach ($this->_routes as $route) {
+            if (method_exists($route, 'getDefault')) {
+                $current = $route->getDefault($name);
+                if (null !== $current) {
+                    $default = $current;
+                }
+            }
+        }
 
-}
+        return $default;
+    }
+
+    /**
+     * Return an array of defaults
+     *
+     * @return array Route defaults
+     */
+    public function getDefaults()
+    {
+        $defaults = array();
+        foreach ($this->_routes as $route) {
+            if (method_exists($route, 'getDefaults')) {
+                $defaults = array_merge($defaults, $route->getDefaults());
+            }
+        }
+
+        return $defaults;
+    }
+}

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

@@ -815,6 +815,113 @@ class Zend_Controller_Router_Route_ChainTest extends PHPUnit_Framework_TestCase
         $this->assertEquals(2, $res['bar']);
     }
 
+    /**
+     * @group ZF-11443
+     */
+    public function testGetDefault()
+    {
+        // Create chained route
+        $chain = new Zend_Controller_Router_Route_Chain();
+
+        $foo = new Zend_Controller_Router_Route_Hostname(
+            'www.example.com', array('foo' => 'foo')
+        );
+        $bar = new Zend_Controller_Router_Route_Regex(
+            'bar', array('bar' => 'bar'), array(), 'bar'
+        );
+        $baz = new Zend_Controller_Router_Route_Static(
+            'baz', array('baz' => 'baz')
+        );
+
+        $chain->chain($foo)->chain($bar)->chain($baz);
+
+        // Test
+        $this->assertSame('foo', $chain->getDefault('foo'));
+        $this->assertSame('bar', $chain->getDefault('bar'));
+        $this->assertSame('baz', $chain->getDefault('baz'));
+    }
+
+    /**
+     * @group ZF-11443
+     */
+    public function testGetDefaultPriority()
+    {
+        // Create chained route
+        $chain = new Zend_Controller_Router_Route_Chain();
+
+        $foo = new Zend_Controller_Router_Route_Hostname(
+            'www.example.com', array('priority' => 1)
+        );
+        $bar = new Zend_Controller_Router_Route_Regex(
+            'bar', array('priority' => 2), array(), 'bar'
+        );
+        $baz = new Zend_Controller_Router_Route_Static(
+            'baz', array('priority' => 3)
+        );
+
+        $chain->chain($foo)->chain($bar)->chain($baz);
+
+        // Test
+        $this->assertSame(3, $chain->getDefault('priority'));
+    }
+
+    /**
+     * @group ZF-11443
+     */
+    public function testGetDefaults()
+    {
+        // Create chained route
+        $chain = new Zend_Controller_Router_Route_Chain();
+
+        $foo = new Zend_Controller_Router_Route_Hostname(
+            'www.example.com', array('foo' => 'foo')
+        );
+        $bar = new Zend_Controller_Router_Route_Regex(
+            'bar', array('bar' => 'bar'), array(), 'bar'
+        );
+        $baz = new Zend_Controller_Router_Route_Static(
+            'baz', array('baz' => 'baz')
+        );
+
+        $chain->chain($foo)->chain($bar)->chain($baz);
+
+        // Get defaults
+        $values = $chain->getDefaults();
+
+        // Test
+        $this->assertTrue(is_array($values));
+        $this->assertSame('foo', $values['foo']);
+        $this->assertSame('bar', $values['bar']);
+        $this->assertSame('baz', $values['baz']);
+    }
+
+    /**
+     * @group ZF-11443
+     */
+    public function testGetDefaultsPriority()
+    {
+        // Create chained route
+        $chain = new Zend_Controller_Router_Route_Chain();
+
+        $foo = new Zend_Controller_Router_Route_Hostname(
+            'www.zend.com', array('priority' => 1)
+        );
+        $bar = new Zend_Controller_Router_Route_Regex(
+            'bar', array('priority' => 2), array(), 'bar'
+        );
+        $baz = new Zend_Controller_Router_Route_Static(
+            'baz', array('priority' => 3)
+        );
+
+        $chain->chain($foo)->chain($bar)->chain($baz);
+
+        // Get defaults
+        $values = $chain->getDefaults();
+
+        // Test
+        $this->assertSame(3, $values['priority']);
+    }
+
     protected function _getRouter()
     {
         $router = new Zend_Controller_Router_Rewrite();