فهرست منبع

choose route builder depending on the manager type

sonata.admin.route.path_info_slashes is a more sensible default if you
use PHPCR, because since Document ids can contain slashes, the regex
that capture it must be able to tolerate these slashes, which is the
main goal of this route builder.
Grégoire Paris 11 سال پیش
والد
کامیت
96b4a2cde8

+ 2 - 1
DependencyInjection/Compiler/AddDependencyCallsCompilerPass.php

@@ -201,7 +201,8 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
             'validator'                 => 'validator',
             'security_handler'          => 'sonata.admin.security.handler',
             'menu_factory'              => 'knp_menu.factory',
-            'route_builder'             => 'sonata.admin.route.path_info',
+            'route_builder'             => 'sonata.admin.route.path_info' .
+                (($manager_type == 'doctrine_phpcr') ? '_slashes' : ''),
             'label_translator_strategy' => 'sonata.admin.label.strategy.native'
         );
 

+ 3 - 2
Resources/doc/reference/advanced.rst

@@ -20,11 +20,12 @@ router                        router
 validator                     validator
 security_handler              sonata.admin.security.handler
 menu_factory                  knp_menu.factory
-route_builder                 sonata.admin.route.path_info
+route_builder                 sonata.admin.route.path_info | sonata.admin.route.path_info_slashes
 label_translator_strategy     sonata.admin.label.strategy.form_component
 =========================     =============================================
 
-Note: %manager-type% is to be replaced by the manager type (orm, doctrine_mongodb...)
+Note: %manager-type% is to be replaced by the manager type (orm, doctrine_mongodb...),
+and the default route_builder depends on it.
 
 You have 2 ways of defining the dependencies inside ``services.xml``:
 

+ 57 - 15
Tests/DependencyInjection/Compiler/AddDependencyCallsCompilerPassTest.php

@@ -111,6 +111,26 @@ class AddDependencyCallsCompilerPassTest extends \PHPUnit_Framework_TestCase
         $this->assertContains('sonata_article_admin', $adminClasses['Sonata\AdminBundle\Tests\DependencyInjection\Article']);
         $this->assertArrayHasKey('Sonata\AdminBundle\Tests\DependencyInjection\News', $adminClasses);
         $this->assertContains('sonata_news_admin', $adminClasses['Sonata\AdminBundle\Tests\DependencyInjection\News']);
+        $this->assertSame(
+            'sonata.admin.route.path_info',
+            (string) current(array_filter(
+                $container->getDefinition('sonata_news_admin')->getMethodCalls(),
+                function ($element) {
+                    return $element[0] == 'setRouteBuilder';
+                }
+            ))[1][0],
+            'The news admin uses the orm, and should therefore use the path_info router.'
+        );
+        $this->assertSame(
+            'sonata.admin.route.path_info_slashes',
+            (string) current(array_filter(
+                $container->getDefinition('sonata_article_admin')->getMethodCalls(),
+                function ($element) {
+                    return $element[0] == 'setRouteBuilder';
+                }
+            ))[1][0],
+            'The article admin uses the odm, and should therefore use the path_info_slashes router.'
+        );
     }
 
     /**
@@ -199,21 +219,43 @@ class AddDependencyCallsCompilerPassTest extends \PHPUnit_Framework_TestCase
         $container
             ->register('form.factory')
             ->setClass('Symfony\Component\Form\FormFactoryInterface');
+        foreach (array(
+            'doctrine_phpcr' => 'PHPCR',
+            'orm'            => 'ORM') as $key => $bundleSubstring) {
+            $container
+                ->register(sprintf('sonata.admin.manager.%s', $key))
+                ->setClass(sprintf(
+                    'Sonata\Doctrine%sAdminBundle\Model\ModelManager',
+                    $bundleSubstring
+                ));
+            $container
+                ->register(sprintf('sonata.admin.builder.%s_form', $key))
+                ->setClass(sprintf(
+                    'Sonata\Doctrine%sAdminBundle\Builder\FormContractor',
+                    $bundleSubstring
+                ));
+            $container
+                ->register(sprintf('sonata.admin.builder.%s_show', $key))
+                ->setClass(sprintf(
+                    'Sonata\Doctrine%sAdminBundle\Builder\ShowBuilder',
+                    $bundleSubstring
+                ));
+            $container
+                ->register(sprintf('sonata.admin.builder.%s_list', $key))
+                ->setClass(sprintf(
+                    'Sonata\Doctrine%sAdminBundle\Builder\ListBuilder',
+                    $bundleSubstring
+                ));
+            $container
+                ->register(sprintf('sonata.admin.builder.%s_datagrid', $key))
+                ->setClass(sprintf(
+                    'Sonata\Doctrine%sAdminBundle\Builder\DatagridBuilder',
+                    $bundleSubstring
+                ));
+        }
         $container
-            ->register('sonata.admin.manager.orm')
-            ->setClass('Sonata\DoctrineORMAdminBundle\Model\ModelManager');
-        $container
-            ->register('sonata.admin.builder.orm_form')
-            ->setClass('Sonata\DoctrineORMAdminBundle\Builder\FormContractor');
-        $container
-            ->register('sonata.admin.builder.orm_show')
-            ->setClass('Sonata\DoctrineORMAdminBundle\Builder\ShowBuilder');
-        $container
-            ->register('sonata.admin.builder.orm_list')
-            ->setClass('Sonata\DoctrineORMAdminBundle\Builder\ListBuilder');
-        $container
-            ->register('sonata.admin.builder.orm_datagrid')
-            ->setClass('Sonata\DoctrineORMAdminBundle\Builder\DatagridBuilder');
+            ->register('sonata.admin.route.path_info_slashes')
+            ->setClass('Sonata\DoctrinePHPCRAdminBundle\Route\PathInfoBuilderSlashes');
         $container
             ->register('sonata.admin.route.cache')
             ->setClass('Sonata\AdminBundle\Route\RoutesCache');
@@ -239,7 +281,7 @@ class AddDependencyCallsCompilerPassTest extends \PHPUnit_Framework_TestCase
             ->register('sonata_article_admin')
             ->setClass('Sonata\AdminBundle\Tests\DependencyInjection\MockAdmin')
             ->setArguments(array('', 'Sonata\AdminBundle\Tests\DependencyInjection\Article', 'SonataAdminBundle:CRUD'))
-            ->addTag('sonata.admin', array('group' => 'sonata_group_one', 'manager_type' => 'orm'));
+            ->addTag('sonata.admin', array('group' => 'sonata_group_one', 'manager_type' => 'doctrine_phpcr'));
 
         return $container;
     }