浏览代码

Raise exception if AdminPool::getAdminByClass is call and more than 1 admin is registered

Thomas Rabaix 11 年之前
父节点
当前提交
7d7dd0683b

+ 9 - 1
Admin/Pool.php

@@ -139,7 +139,15 @@ class Pool
             return null;
         }
 
-        return $this->getInstance($this->adminClasses[$class]);
+        if (!is_array($this->adminClasses[$class])) {
+            throw new \RuntimeException("Invalid format for the Pool::adminClass property");
+        }
+
+        if (count($this->adminClasses[$class]) > 1) {
+            throw new \RuntimeException(sprintf('Unable to found a valid admin for the class: %s, get too many admin registered: %s', $class, implode(",", $this->adminClasses[$class])));
+        }
+
+        return $this->getInstance($this->adminClasses[$class][0]);
     }
 
     /**

+ 6 - 1
DependencyInjection/Compiler/AddDependencyCallsCompilerPass.php

@@ -56,7 +56,12 @@ class AddDependencyCallsCompilerPass implements CompilerPassInterface
                 $arguments = $definition->getArguments();
 
                 $admins[] = $id;
-                $classes[$arguments[1]] = $id;
+
+                if (!isset($classes[$arguments[1]])) {
+                    $classes[$arguments[1]] = array();
+                }
+
+                $classes[$arguments[1]][] = $id;
 
                 $showInDashboard = (boolean) (isset($attributes['show_in_dashboard']) ? $attributes['show_in_dashboard'] : true);
                 if (!$showInDashboard) {

+ 24 - 1
Tests/Admin/PoolTest.php

@@ -126,10 +126,33 @@ class PoolTest extends \PHPUnit_Framework_TestCase
         $this->assertNull($this->pool->getAdminByClass('notexists'));
     }
 
-    public function testGetAdminForClassWhenAdminClassIsSet()
+    /**
+     *
+     * @expectedException \RuntimeException
+     */
+    public function testGetAdminForClassWithInvalidFormat()
     {
         $this->pool->setAdminClasses(array('someclass' => 'sonata.user.admin.group1'));
         $this->assertTrue($this->pool->hasAdminByClass('someclass'));
+
+        $this->pool->getAdminByClass('someclass');
+    }
+
+    /**
+     *
+     * @expectedException \RuntimeException
+     */
+    public function testGetAdminForClassWithTooManyRegisteredAdmin()
+    {
+        $this->pool->setAdminClasses(array('someclass' => array('sonata.user.admin.group1', 'sonata.user.admin.group2')));
+        $this->assertTrue($this->pool->hasAdminByClass('someclass'));
+        $this->assertEquals('adminUserClass', $this->pool->getAdminByClass('someclass'));
+    }
+
+    public function testGetAdminForClassWhenAdminClassIsSet()
+    {
+        $this->pool->setAdminClasses(array('someclass' => array('sonata.user.admin.group1')));
+        $this->assertTrue($this->pool->hasAdminByClass('someclass'));
         $this->assertEquals('adminUserClass', $this->pool->getAdminByClass('someclass'));
     }
 

+ 1 - 1
Tests/Twig/Extension/SonataAdminExtensionTest.php

@@ -583,7 +583,7 @@ class SonataAdminExtensionTest extends \PHPUnit_Framework_TestCase
         $enitity = new \stdClass();
 
         // set admin to pool
-        $this->pool->setAdminClasses(array('stdClass'=>'sonata_admin_foo_service'));
+        $this->pool->setAdminClasses(array('stdClass'=> array('sonata_admin_foo_service')));
 
         $this->admin->expects($this->once())
             ->method('getUrlsafeIdentifier')