Browse Source

Add missing Route constructor parameters to RouteCollection:add method

Christian Kolb 10 years ago
parent
commit
45b50a3f39
4 changed files with 83 additions and 9 deletions
  1. 3 0
      CHANGELOG.md
  2. 19 0
      Resources/doc/reference/routing.rst
  3. 16 9
      Route/RouteCollection.php
  4. 45 0
      Tests/Route/RouteCollectionTest.php

+ 3 - 0
CHANGELOG.md

@@ -1,6 +1,9 @@
 CHANGELOG
 =========
 
+### 2015-06-18
+ * Add missing Route constructor parameters to ``RouteCollection:add`` method
+
 ### 2015-03-04
  * [BC BREAK] Admin LTE 2.0 used. Assets files changed.
  * [BC BREAK] moved ``sonata_wrapper`` block on ```standard_layout.html.twig```

+ 19 - 0
Resources/doc/reference/routing.rst

@@ -107,6 +107,25 @@ explicitly this defaults to the action name.
         }
     }
 
+Make use of all route parameters
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As the ``add`` method create a Symfony ``Route``, you can use all constructor arguments of the ``Route`` as parameters
+in the ``add`` method to set additional settings like this:
+
+.. code-block:: php
+
+    <?php
+    use Sonata\AdminBundle\Route\RouteCollection;
+
+    class MediaAdmin extends Admin
+    {
+        protected function configureRoutes(RouteCollection $collection)
+        {
+            $collection->add('custom_action', $this->getRouterIdParameter().'/custom-action', array(), array(), array(), '', array('https'), array('GET','POST'));
+        }
+    }
+
 Other steps needed to create your new action
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

+ 16 - 9
Route/RouteCollection.php

@@ -46,15 +46,21 @@ class RouteCollection
     }
 
     /**
-     * @param string $name
-     * @param string $pattern
-     * @param array  $defaults
-     * @param array  $requirements
-     * @param array  $options
+     * Add route.
      *
-     * @return \Sonata\AdminBundle\Route\RouteCollection
+     * @param string $name         Name
+     * @param string $pattern      Pattern (will be automatically combined with @see $this->baseRoutePattern and $name
+     * @param array  $defaults     Defaults
+     * @param array  $requirements Requirements
+     * @param array  $options      Options
+     * @param string $host         Host
+     * @param array  $schemes      Schemes
+     * @param array  $methods      Methods
+     * @param string $condition    Condition
+     *
+     * @return RouteCollection
      */
-    public function add($name, $pattern = null, array $defaults = array(), array $requirements = array(), array $options = array())
+    public function add($name, $pattern = null, array $defaults = array(), array $requirements = array(), array $options = array(), $host = '', array $schemes = array(), array $methods = array(), $condition = '')
     {
         $pattern    = $this->baseRoutePattern.'/'.($pattern ?: $name);
         $code       = $this->getCode($name);
@@ -70,8 +76,9 @@ class RouteCollection
 
         $defaults['_sonata_name'] = $routeName;
 
-        $this->elements[$this->getCode($name)] = function () use ($pattern, $defaults, $requirements, $options) {
-            return new Route($pattern, $defaults, $requirements, $options);
+        $this->elements[$this->getCode($name)] = function () use (
+            $pattern, $defaults, $requirements, $options, $host, $schemes, $methods, $condition) {
+            return new Route($pattern, $defaults, $requirements, $options, $host, $schemes, $methods, $condition);
         };
 
         return $this;

+ 45 - 0
Tests/Route/RouteCollectionTest.php

@@ -122,6 +122,51 @@ class RouteCollectionTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals('baseRouteName_view', $route->getDefault('_sonata_name'));
     }
 
+    public function testRouteWithAllConstructorParameters()
+    {
+        $baseCodeRoute = 'baseCodeRoute';
+        $baseRouteName = 'baseRouteName';
+        $baseRoutePattern = 'baseRoutePattern';
+        $routeCollection = new RouteCollection($baseCodeRoute, $baseRouteName, $baseRoutePattern, 'BundleName:ControllerName');
+
+        $name = 'view';
+        $pattern = 'view';
+        $defaults = array(
+            '_controller' => 'BundleName:ControllerName:viewAction',
+        );
+        $requirements = array(
+            'page' => '\d+',
+        );
+        $options = array(
+            'debug' => true,
+        );
+        $host = 'test.local';
+        $schemes = array(
+            'https',
+        );
+        $methods = array(
+            'GET',
+            'POST',
+        );
+        $condition = "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'";
+
+        $routeCollection->add($name, $pattern, $defaults, $requirements, $options, $host, $schemes, $methods, $condition);
+
+        $route = $routeCollection->get($name);
+
+        $combinedPattern = '/'.$baseRoutePattern.'/'.($pattern ?: $name);
+
+        $this->assertSame($combinedPattern, $route->getPath());
+        $this->assertArrayHasKey('_controller', $route->getDefaults());
+        $this->assertArrayHasKey('page', $route->getRequirements());
+        $this->assertArrayHasKey('debug', $route->getOptions());
+        $this->assertSame($host, $route->getHost());
+        $this->assertEquals($methods, $route->getMethods());
+        if (method_exists($route, 'getCondition')) {
+            $this->assertSame($condition, $route->getCondition());
+        }
+    }
+
     public function testRouteControllerService()
     {
         $routeCollection = new RouteCollection('baseCodeRoute', 'baseRouteName', 'baseRoutePattern', 'baseControllerServiceName');