Просмотр исходного кода

[ZF-9517] Zend_Json_Server: allow named parameters in any order

Tested, formatted and applied patch from ajbrown

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22237 44c647ce-9c0f-0410-b52a-842ac1e357ba
andyfowler 15 лет назад
Родитель
Сommit
54a18a88a6
2 измененных файлов с 73 добавлено и 0 удалено
  1. 31 0
      library/Zend/Json/Server.php
  2. 42 0
      tests/Zend/Json/ServerTest.php

+ 31 - 0
library/Zend/Json/Server.php

@@ -526,6 +526,37 @@ class Zend_Json_Server extends Zend_Server_Abstract
             $params = $this->_getDefaultParams($params, $serviceParams);
         }
 
+        //Make sure named parameters are passed in correct order
+        if ( is_string( key( $params ) ) ) {
+
+            $callback = $invocable->getCallback();
+            if ('function' == $callback->getType()) {
+                $reflection = new ReflectionFunction( $callback->getFunction() );
+                $refParams  = $reflection->getParameters();
+            } else {
+                
+                $reflection = new ReflectionMethod( 
+                    $callback->getClass(),
+                    $callback->getMethod()
+                );
+                $refParams = $reflection->getParameters();
+            }
+
+            $orderedParams = array();
+            foreach( $reflection->getParameters() as $refParam ) {
+                if( isset( $params[ $refParam->getName() ] ) ) {
+                    $orderedParams[ $refParam->getName() ] = $params[ $refParam->getName() ];
+                } elseif( $refParam->isOptional() ) {
+                    $orderedParams[ $refParam->getName() ] = null;
+                } else {
+                    throw new Zend_Server_Exception( 
+                        'Missing required parameter: ' . $refParam->getName() 
+                    ); 
+                }
+            }
+            $params = $orderedParams;
+        }
+
         try {
             $result = $this->_dispatch($invocable, $params);
         } catch (Exception $e) {

+ 42 - 0
tests/Zend/Json/ServerTest.php

@@ -322,6 +322,48 @@ class Zend_Json_ServerTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('bar', $result[2]);
     }
 
+    public function testHandleShouldAllowNamedParamsInAnyOrder1()
+    {
+        $this->server->setClass('Zend_Json_ServerTest_Foo')
+                     ->setAutoEmitResponse( false );
+        $request = $this->server->getRequest();
+        $request->setMethod('bar')
+                ->setParams( array( 
+                    'three' => 3,
+                    'two'   => 2,
+                    'one'   => 1
+                ))
+                ->setId( 'foo' );
+        $response = $this->server->handle();
+        $result = $response->getResult();
+
+        $this->assertTrue( is_array( $result ) );
+        $this->assertEquals( 1, $result[0] );
+        $this->assertEquals( 2, $result[1] );
+        $this->assertEquals( 3, $result[2] );
+    }
+
+    public function testHandleShouldAllowNamedParamsInAnyOrder2()
+    {
+        $this->server->setClass('Zend_Json_ServerTest_Foo')
+                     ->setAutoEmitResponse( false );
+        $request = $this->server->getRequest();
+        $request->setMethod('bar')
+                ->setParams( array( 
+                    'three' => 3,
+                    'one'   => 1,
+                    'two'   => 2,
+                ) )
+                ->setId( 'foo' );
+        $response = $this->server->handle();
+        $result = $response->getResult();
+
+        $this->assertTrue( is_array( $result ) );
+        $this->assertEquals( 1, $result[0] );
+        $this->assertEquals( 2, $result[1] );
+        $this->assertEquals( 3, $result[2] );
+    }
+
     public function testHandleRequestWithErrorsShouldReturnErrorResponse()
     {
         $this->server->setClass('Zend_Json_ServerTest_Foo')