]> source.dussan.org Git - nextcloud-server.git/commitdiff
make it possible to omit parameters and use the default parameters from the controlle...
authorBernhard Posselt <dev@bernhard-posselt.com>
Tue, 13 May 2014 08:40:49 +0000 (10:40 +0200)
committerBernhard Posselt <dev@bernhard-posselt.com>
Tue, 13 May 2014 08:40:49 +0000 (10:40 +0200)
lib/private/appframework/http/dispatcher.php
lib/private/appframework/utility/controllermethodreflector.php
tests/lib/appframework/http/DispatcherTest.php
tests/lib/appframework/utility/ControllerMethodReflectorTest.php

index 39ca3398c66508e1fae36feded2ace6d680aca35..442e33ee726944059af0122af4d501311bd36aa8 100644 (file)
@@ -126,11 +126,11 @@ class Dispatcher {
                // valid types that will be casted
                $types = array('int', 'integer', 'bool', 'boolean', 'float');
 
-               foreach($this->reflector->getParameters() as $param) {
+               foreach($this->reflector->getParameters() as $param => $default) {
 
                        // try to get the parameter from the request object and cast
                        // it to the type annotated in the @param annotation
-                       $value = $this->request->getParam($param);
+                       $value = $this->request->getParam($param, $default);
                        $type = $this->reflector->getType($param);
                        
                        // if this is submitted using GET or a POST form, 'false' should be 
index c9cdadcca4a0ec8ab2659dfc236303de1def17c7..a1519c7280990a154b42d3636b9c427a6de9a61d 100644 (file)
@@ -59,7 +59,12 @@ class ControllerMethodReflector {
 
                // get method parameters
                foreach ($reflection->getParameters() as $param) {
-                       $this->parameters[] = $param->name;
+                       if($param->isOptional()) {
+                               $default = $param->getDefaultValue();
+                       } else {
+                               $default = null;
+                       }
+                       $this->parameters[$param->name] = $default;
                }
        }
 
@@ -81,7 +86,7 @@ class ControllerMethodReflector {
 
 
        /**
-        * @return array the arguments of the method
+        * @return array the arguments of the method with key => default value
         */
        public function getParameters() {
                return $this->parameters;
index 2aef2911e2ca5928e746452c37846360886690ac..8117eec2075920a9069ef112a788d81047d65f7b 100644 (file)
@@ -40,11 +40,11 @@ class TestController extends Controller {
         * @param int $int
         * @param bool $bool
         */
-       public function exec($int, $bool) {
+       public function exec($int, $bool, $test=4, $test2=1) {
                $this->registerResponder('text', function($in) {
                        return new JSONResponse(array('text' => $in));
                });
-               return array($int, $bool);
+               return array($int, $bool, $test, $test2);
        }
 }
 
@@ -262,6 +262,7 @@ class DispatcherTest extends \PHPUnit_Framework_TestCase {
                        }));
        }
 
+
        public function testControllerParametersInjected() {
                $this->request = new Request(array(
                        'post' => array(
@@ -280,10 +281,34 @@ class DispatcherTest extends \PHPUnit_Framework_TestCase {
                $this->dispatcherPassthrough();
                $response = $this->dispatcher->dispatch($controller, 'exec');
 
-               $this->assertEquals('[3,true]', $response[2]);
+               $this->assertEquals('[3,true,4,1]', $response[2]);
+       }
+
+
+       public function testControllerParametersInjectedDefaultOverwritten() {
+               $this->request = new Request(array(
+                       'post' => array(
+                               'int' => '3',
+                               'bool' => 'false',
+                               'test2' => 7
+                       ),
+                       'method' => 'POST'
+               ));
+               $this->dispatcher = new Dispatcher(
+                       $this->http, $this->middlewareDispatcher, $this->reflector,
+                       $this->request
+               );
+               $controller = new TestController('app', $this->request);
+
+               // reflector is supposed to be called once
+               $this->dispatcherPassthrough();
+               $response = $this->dispatcher->dispatch($controller, 'exec');
+
+               $this->assertEquals('[3,true,4,7]', $response[2]);
        }
 
 
+
        public function testResponseTransformedByUrlFormat() {
                $this->request = new Request(array(
                        'post' => array(
@@ -305,7 +330,7 @@ class DispatcherTest extends \PHPUnit_Framework_TestCase {
                $this->dispatcherPassthrough();
                $response = $this->dispatcher->dispatch($controller, 'exec');
 
-               $this->assertEquals('{"text":[3,false]}', $response[2]);
+               $this->assertEquals('{"text":[3,false,4,1]}', $response[2]);
        }
 
 
@@ -331,7 +356,7 @@ class DispatcherTest extends \PHPUnit_Framework_TestCase {
                $this->dispatcherPassthrough();
                $response = $this->dispatcher->dispatch($controller, 'exec');
 
-               $this->assertEquals('{"text":[3,false]}', $response[2]);
+               $this->assertEquals('{"text":[3,false,4,1]}', $response[2]);
        }
 
 
@@ -359,7 +384,10 @@ class DispatcherTest extends \PHPUnit_Framework_TestCase {
                $this->dispatcherPassthrough();
                $response = $this->dispatcher->dispatch($controller, 'exec');
 
-               $this->assertEquals('{"text":[3,true]}', $response[2]);
+               $this->assertEquals('{"text":[3,true,4,1]}', $response[2]);
        }
 
+
+
+
 }
index cccc768888401af0d50abbca6f7ff48ec4964247..8939a203edbc289a1d1a8fb80e9b8c5a9ce21ae9 100644 (file)
@@ -88,7 +88,7 @@ class ControllerMethodReflectorTest extends \PHPUnit_Framework_TestCase {
        }
 
 
-       public function arguments($arg, $arg2) {}
+       public function arguments($arg, $arg2='hi') {}
        public function testReflectParameters() {
                $reader = new ControllerMethodReflector();
                $reader->reflect(
@@ -96,7 +96,7 @@ class ControllerMethodReflectorTest extends \PHPUnit_Framework_TestCase {
                        'arguments'
                );
 
-               $this->assertEquals(array('arg', 'arg2'), $reader->getParameters());    
+               $this->assertEquals(array('arg' => null, 'arg2' => 'hi'), $reader->getParameters());    
        }
 
 
@@ -108,7 +108,7 @@ class ControllerMethodReflectorTest extends \PHPUnit_Framework_TestCase {
                        'arguments2'
                );
 
-               $this->assertEquals(array('arg',), $reader->getParameters());   
+               $this->assertEquals(array('arg' => null), $reader->getParameters());    
        }