Skip to content

Commit dbda894

Browse files
committed
Merge branch '4.x' into 5.x
* 4.x: Fix batch actions with ugly URLs - Improve findRoute() method in admin route generator
2 parents b7db09c + a95c204 commit dbda894

File tree

2 files changed

+94
-2
lines changed

2 files changed

+94
-2
lines changed

src/Router/AdminRouteGenerator.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,16 @@ public function usesPrettyUrls(): bool
9494
return $this->applicationUsesPrettyUrls ??= $this->filesystem->exists(sprintf('%s/%s', $this->buildDir, AdminRouteLoader::PRETTY_URLS_CONTEXT_FILE_NAME));
9595
}
9696

97-
public function findRouteName(string $dashboardFqcn, string $crudControllerFqcn, string $actionName): ?string
97+
public function findRouteName(?string $dashboardFqcn = null, ?string $crudControllerFqcn = null, ?string $actionName = null): ?string
9898
{
9999
$adminRoutes = $this->cache->getItem(self::CACHE_KEY_FQCN_TO_ROUTE)->get();
100100

101-
return $adminRoutes[$dashboardFqcn][$crudControllerFqcn][$actionName] ?? null;
101+
if (null === $dashboardFqcn) {
102+
$dashboardControllers = iterator_to_array($this->dashboardControllers);
103+
$dashboardFqcn = $dashboardControllers[array_key_first($dashboardControllers)]::class;
104+
}
105+
106+
return $adminRoutes[$dashboardFqcn][$crudControllerFqcn ?? ''][$actionName ?? ''] ?? null;
102107
}
103108

104109
/**
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
3+
namespace EasyCorp\Bundle\EasyAdminBundle\Tests\Router;
4+
5+
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminRouteGenerator;
6+
use EasyCorp\Bundle\EasyAdminBundle\Tests\PrettyUrlsTestApplication\Controller\BlogPostCrudController;
7+
use EasyCorp\Bundle\EasyAdminBundle\Tests\PrettyUrlsTestApplication\Controller\CategoryCrudController;
8+
use EasyCorp\Bundle\EasyAdminBundle\Tests\PrettyUrlsTestApplication\Controller\DashboardController;
9+
use EasyCorp\Bundle\EasyAdminBundle\Tests\PrettyUrlsTestApplication\Controller\SecondDashboardController;
10+
use Psr\Cache\CacheItemPoolInterface;
11+
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
12+
use Symfony\Component\Cache\CacheItem;
13+
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
14+
use Symfony\Component\Filesystem\Filesystem;
15+
16+
class AdminRouteGeneratorTest extends WebTestCase
17+
{
18+
/**
19+
* @dataProvider provideFindRouteData
20+
*/
21+
public function testFindRoute(?string $dashboardControllerFqcn, ?string $crudControllerFqcn, ?string $action, ?string $expectedRouteName)
22+
{
23+
$client = static::createClient();
24+
$cacheMock = $this->getMockBuilder(CacheItemPoolInterface::class)->getMock();
25+
$cacheMock->method('getItem')->willReturnCallback(function ($key) {
26+
$item = new CacheItem();
27+
$item->expiresAfter(3600);
28+
29+
if (AdminRouteGenerator::CACHE_KEY_FQCN_TO_ROUTE !== $key) {
30+
return $item;
31+
}
32+
33+
$item->set([
34+
DashboardController::class => [
35+
'' => [
36+
'' => 'admin',
37+
],
38+
BlogPostCrudController::class => [
39+
'index' => 'admin_post_index',
40+
'new' => 'admin_post_new',
41+
'edit' => 'admin_post_edit',
42+
'detail' => 'admin_post_detail',
43+
],
44+
],
45+
SecondDashboardController::class => [
46+
'' => [
47+
'' => 'second_admin',
48+
],
49+
],
50+
]);
51+
52+
return $item;
53+
});
54+
55+
$dashboardControllers = new RewindableGenerator(function () {
56+
yield DashboardController::class => new DashboardController();
57+
yield SecondDashboardController::class => new SecondDashboardController();
58+
}, 2);
59+
60+
$adminRouteGenerator = new AdminRouteGenerator(
61+
$dashboardControllers,
62+
[],
63+
$cacheMock,
64+
new Filesystem(),
65+
$client->getKernel()->getBuildDir(),
66+
);
67+
68+
$routeName = $adminRouteGenerator->findRouteName($dashboardControllerFqcn, $crudControllerFqcn, $action);
69+
$this->assertSame($expectedRouteName, $routeName);
70+
}
71+
72+
public function provideFindRouteData(): iterable
73+
{
74+
yield [null, null, null, 'admin'];
75+
yield [DashboardController::class, null, null, 'admin'];
76+
yield [DashboardController::class, BlogPostCrudController::class, null, null];
77+
yield [DashboardController::class, BlogPostCrudController::class, 'index', 'admin_post_index'];
78+
yield [DashboardController::class, BlogPostCrudController::class, 'detail', 'admin_post_detail'];
79+
yield [DashboardController::class, CategoryCrudController::class, null, null];
80+
yield [DashboardController::class, CategoryCrudController::class, 'index', null];
81+
yield [DashboardController::class, CategoryCrudController::class, 'detail', null];
82+
yield [SecondDashboardController::class, null, null, 'second_admin'];
83+
yield [SecondDashboardController::class, BlogPostCrudController::class, null, null];
84+
yield [SecondDashboardController::class, BlogPostCrudController::class, 'index', null];
85+
yield [SecondDashboardController::class, BlogPostCrudController::class, 'detail', null];
86+
}
87+
}

0 commit comments

Comments
 (0)