Skip to content
This repository was archived by the owner on Sep 16, 2021. It is now read-only.

Commit a158791

Browse files
authored
Merge pull request #81 from symfony-cmf/description/sub_classes
Also support sub classes in admin descriptor
2 parents 1d483a8 + ea00db3 commit a158791

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

src/Description/SonataEnhancer.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class SonataEnhancer implements DescriptionEnhancerInterface
3939
*/
4040
private $urlGenerator;
4141

42+
private $adminMap = [];
43+
4244
/**
4345
* @param Pool $pool
4446
* @param UrlGeneratorInterface $urlGenerator
@@ -58,7 +60,7 @@ public function enhance(Description $description)
5860

5961
// sonata has dependency on ClassUtils so this is fine.
6062
$class = ClassUtils::getClass($object);
61-
$admin = $this->pool->getAdminByClass($class);
63+
$admin = $this->getAdminByClass($class);
6264

6365
$links = [];
6466

@@ -118,6 +120,22 @@ public function supports(PuliResource $resource)
118120
// sonata has dependency on ClassUtils so this is fine.
119121
$class = ClassUtils::getClass($payload);
120122

121-
return $this->pool->hasAdminByClass($class);
123+
return null !== $this->getAdminByClass($class);
124+
}
125+
126+
private function getAdminByClass($class)
127+
{
128+
if (array_key_exists($class, $this->adminMap)) {
129+
return $this->adminMap[$class];
130+
}
131+
132+
$_class = $class;
133+
while ($_class && !$this->pool->hasAdminByClass($_class)) {
134+
$_class = get_parent_class($_class);
135+
}
136+
137+
$this->adminMap[$class] = $_class ? $this->pool->getAdminByClass($_class) : null;
138+
139+
return $this->adminMap[$class];
122140
}
123141
}

tests/Unit/Description/SonataEnhancerTest.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public function setUp()
4040
$this->pool = new Pool($this->container, 'Test', 'logo');
4141
$this->pool->setAdminClasses([
4242
'stdClass' => ['std_class_admin'],
43+
'Exception' => ['std_class_admin'],
4344
]);
4445
$this->pool->setAdminServiceIds(['std_class_admin']);
4546

@@ -58,11 +59,11 @@ public function setUp()
5859
}
5960

6061
/**
61-
* It should provide a description.
62+
* @dataProvider provideDescriptionData
6263
*/
63-
public function testDescriptionProvide()
64+
public function testDescriptionProvide($class)
6465
{
65-
$this->resource->getPayload()->willReturn(new \stdClass());
66+
$this->resource->getPayload()->willReturn($class);
6667

6768
$this->generator->generate(Argument::cetera())->will(function ($args) {
6869
return '/'.$args[0];
@@ -77,6 +78,14 @@ public function testDescriptionProvide()
7778
$this->assertEquals('/std_class_show', $description->get(Descriptor::LINK_SHOW_HTML));
7879
$this->assertEquals('/std_class_delete', $description->get(Descriptor::LINK_REMOVE_HTML));
7980
}
81+
82+
public function provideDescriptionData()
83+
{
84+
return [
85+
[new \stdClass()],
86+
[new \LogicException()],
87+
];
88+
}
8089
}
8190

8291
class TestAdmin extends AbstractAdmin

0 commit comments

Comments
 (0)