Skip to content

Commit ccbe6b0

Browse files
committed
Enable EasyAdmin pretty URLs
1 parent deb4f80 commit ccbe6b0

11 files changed

Lines changed: 43 additions & 43 deletions

config/routes/easyadmin.yaml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# EasyAdmin route loader for pretty URLs, not used by Dirigent yet
2-
#easyadmin:
3-
# resource: .
4-
# type: easyadmin.routes
1+
easyadmin:
2+
resource: .
3+
type: easyadmin.routes

src/Controller/Dashboard/DashboardAccessTokenController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use CodedMonkey\Dirigent\Doctrine\Entity\AccessToken;
66
use CodedMonkey\Dirigent\Doctrine\Entity\User;
77
use Doctrine\ORM\QueryBuilder;
8+
use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminCrud;
89
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
910
use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
1011
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
@@ -19,6 +20,7 @@
1920
use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;
2021
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
2122

23+
#[AdminCrud(routePath: '/access-tokens', routeName: 'dashboard_access_tokens')]
2224
class DashboardAccessTokenController extends AbstractCrudController implements EventSubscriberInterface
2325
{
2426
public static function getEntityFqcn(): string

src/Controller/Dashboard/DashboardAccountController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public function __construct(
3131
) {
3232
}
3333

34-
#[Route('/dashboard/account', name: 'dashboard_account')]
34+
#[Route('/account', name: 'dashboard_account')]
3535
#[IsGranted('ROLE_USER')]
3636
public function account(Request $request, #[CurrentUser] User $user): Response
3737
{

src/Controller/Dashboard/DashboardCredentialsController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44

55
use CodedMonkey\Dirigent\Doctrine\Entity\Credentials;
66
use CodedMonkey\Dirigent\Doctrine\Entity\CredentialsType;
7+
use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminCrud;
78
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
89
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
910
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
1011
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
1112
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
1213

14+
#[AdminCrud(routePath: '/credentials', routeName: 'dashboard_credentials')]
1315
class DashboardCredentialsController extends AbstractCrudController
1416
{
1517
public static function getEntityFqcn(): string

src/Controller/Dashboard/DashboardPackagesController.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public function __construct(
3434
) {
3535
}
3636

37-
#[Route('/dashboard/packages', name: 'dashboard_packages')]
37+
#[Route('/packages', name: 'dashboard_packages')]
3838
#[IsGrantedAccess]
3939
public function list(Request $request): Response
4040
{
@@ -57,7 +57,7 @@ public function list(Request $request): Response
5757
]);
5858
}
5959

60-
#[Route('/dashboard/packages/info/{packageName}/{packageVersion}', name: 'dashboard_packages_info', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
60+
#[Route('/packages/{packageName}/{packageVersion}', name: 'dashboard_packages_info', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
6161
#[IsGrantedAccess]
6262
public function info(string $packageName, ?string $packageVersion = null): Response
6363
{
@@ -81,7 +81,7 @@ public function info(string $packageName, ?string $packageVersion = null): Respo
8181
]);
8282
}
8383

84-
#[Route('/dashboard/packages/versions/{packageName}', name: 'dashboard_packages_versions', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
84+
#[Route('/packages/{packageName}/versions', name: 'dashboard_packages_versions', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
8585
#[IsGrantedAccess]
8686
public function versions(string $packageName): Response
8787
{
@@ -96,7 +96,7 @@ public function versions(string $packageName): Response
9696
]);
9797
}
9898

99-
#[Route('/dashboard/packages/statistics/{packageName}', name: 'dashboard_packages_statistics', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
99+
#[Route('/packages/{packageName}/statistics', name: 'dashboard_packages_statistics', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
100100
#[IsGrantedAccess]
101101
public function statistics(string $packageName): Response
102102
{
@@ -138,7 +138,7 @@ public function statistics(string $packageName): Response
138138
]);
139139
}
140140

141-
#[Route('/dashboard/packages/add-mirroring', name: 'dashboard_packages_add_mirroring')]
141+
#[Route('/packages/add-mirroring', name: 'dashboard_packages_add_mirroring')]
142142
#[IsGranted('ROLE_ADMIN')]
143143
public function addMirroring(Request $request): Response
144144
{
@@ -221,7 +221,7 @@ public function addMirroring(Request $request): Response
221221
]);
222222
}
223223

224-
#[Route('/dashboard/packages/add-vcs', name: 'dashboard_packages_add_vcs')]
224+
#[Route('/packages/add-vcs', name: 'dashboard_packages_add_vcs')]
225225
#[IsGranted('ROLE_ADMIN')]
226226
public function addVcsRepository(Request $request): Response
227227
{
@@ -244,7 +244,7 @@ public function addVcsRepository(Request $request): Response
244244
]);
245245
}
246246

247-
#[Route('/dashboard/packages/edit/{packageName}', name: 'dashboard_packages_edit', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
247+
#[Route('/packages/{packageName}/edit', name: 'dashboard_packages_edit', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
248248
#[IsGranted('ROLE_ADMIN')]
249249
public function edit(Request $request, string $packageName): Response
250250
{
@@ -270,7 +270,7 @@ public function edit(Request $request, string $packageName): Response
270270
]);
271271
}
272272

273-
#[Route('/dashboard/packages/update/{packageName}', name: 'dashboard_packages_update', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
273+
#[Route('/packages/{packageName}/update', name: 'dashboard_packages_update', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
274274
#[IsGranted('ROLE_ADMIN')]
275275
public function update(string $packageName): Response
276276
{
@@ -281,7 +281,7 @@ public function update(string $packageName): Response
281281
return $this->redirect($this->adminUrlGenerator->setRoute('dashboard_packages_info', ['packageName' => $package->getName()])->generateUrl());
282282
}
283283

284-
#[Route('/dashboard/packages/delete/{packageName}', name: 'dashboard_packages_delete', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
284+
#[Route('/packages/{packageName}/delete', name: 'dashboard_packages_delete', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
285285
#[IsGranted('ROLE_ADMIN')]
286286
public function delete(string $packageName): Response
287287
{

src/Controller/Dashboard/DashboardRegistryController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use CodedMonkey\Dirigent\Doctrine\Entity\RegistryPackageMirroring;
77
use CodedMonkey\Dirigent\Doctrine\Repository\RegistryRepository;
88
use CodedMonkey\Dirigent\EasyAdmin\DateIntervalField;
9+
use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminCrud;
910
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
1011
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
1112
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
@@ -19,6 +20,7 @@
1920
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
2021
use Symfony\Component\HttpFoundation\RedirectResponse;
2122

23+
#[AdminCrud(routePath: '/registries', routeName: 'dashboard_registries')]
2224
class DashboardRegistryController extends AbstractCrudController
2325
{
2426
public static function getEntityFqcn(): string

src/Controller/Dashboard/DashboardRootController.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
1111
use CodedMonkey\Dirigent\Kernel;
1212
use Composer\Composer;
13+
use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminDashboard;
1314
use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
1415
use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
1516
use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
@@ -25,6 +26,7 @@
2526
use Symfony\Component\Security\Http\Attribute\IsGranted;
2627
use Symfony\Component\Yaml\Yaml;
2728

29+
#[AdminDashboard(routePath: '/', routeName: 'dashboard')]
2830
class DashboardRootController extends AbstractDashboardController
2931
{
3032
public function __construct(
@@ -54,7 +56,7 @@ public function configureMenuItems(): iterable
5456
/** @var User|null $user */
5557
$user = $this->getUser();
5658

57-
$packagesItem = MenuItem::linkToRoute('Packages', 'fa fa-cubes', 'dashboard_packages');
59+
$packagesItem = MenuItem::linkToUrl('Packages', 'fa fa-cubes', $this->generateUrl('dashboard_packages'));
5860
if (str_starts_with($request->query->getString('routeName'), 'dashboard_packages_')) {
5961
$packagesItem->getAsDto()->setSelected(true);
6062
}
@@ -65,13 +67,13 @@ public function configureMenuItems(): iterable
6567
yield MenuItem::section('Personal');
6668
if ($user) {
6769
yield MenuItem::linkToCrud('Access tokens', 'fa fa-key', AccessToken::class);
68-
yield MenuItem::linkToRoute('Account', 'fa fa-id-card', 'dashboard_account');
70+
yield MenuItem::linkToUrl('Account', 'fa fa-id-card', $this->generateUrl('dashboard_account'));
6971
yield MenuItem::linkToLogout('Sign out', 'fa fa-user-xmark');
7072
} else {
71-
yield MenuItem::linkToRoute('Sign in', 'fa fa-user', 'dashboard_login');
73+
yield MenuItem::linkToUrl('Sign in', 'fa fa-user', $this->generateUrl('dashboard_login'));
7274

7375
if ($this->registrationEnabled) {
74-
yield MenuItem::linkToRoute('Register', 'fa fa-user-plus', 'dashboard_register');
76+
yield MenuItem::linkToUrl('Register', 'fa fa-user-plus', $this->generateUrl('dashboard_register'));
7577
}
7678
}
7779

@@ -83,10 +85,10 @@ public function configureMenuItems(): iterable
8385
}
8486

8587
yield MenuItem::section('Documentation');
86-
yield MenuItem::linkToRoute('Usage', 'fa fa-file', 'dashboard_usage_docs');
87-
yield MenuItem::linkToRoute('Administration', 'fa fa-file', 'dashboard_admin_docs')
88+
yield MenuItem::linkToUrl('Usage', 'fa fa-file', $this->generateUrl('dashboard_usage_docs'));
89+
yield MenuItem::linkToUrl('Administration', 'fa fa-file', $this->generateUrl('dashboard_admin_docs'))
8890
->setPermission('ROLE_ADMIN');
89-
yield MenuItem::linkToRoute('Credits', 'fa fa-file', 'dashboard_credits');
91+
yield MenuItem::linkToUrl('Credits', 'fa fa-file', $this->generateUrl('dashboard_credits'));
9092
}
9193

9294
/**
@@ -97,7 +99,7 @@ public function configureUserMenu(UserInterface $user): UserMenu
9799
$menu = parent::configureUserMenu($user)
98100
->setName($user->getUserIdentifier())
99101
->addMenuItems([
100-
MenuItem::linkToRoute('Account', 'fa fa-id-card', 'dashboard_account'),
102+
MenuItem::linkToUrl('Account', 'fa fa-id-card', $this->generateUrl('dashboard_account')),
101103
]);
102104

103105
if ($email = $user->getEmail()) {
@@ -107,7 +109,6 @@ public function configureUserMenu(UserInterface $user): UserMenu
107109
return $menu;
108110
}
109111

110-
#[Route('/', name: 'dashboard')]
111112
#[IsGrantedAccess]
112113
public function index(): Response
113114
{

src/Controller/Dashboard/DashboardUserController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use CodedMonkey\Dirigent\Doctrine\Entity\User;
66
use CodedMonkey\Dirigent\Form\NewPasswordType;
7+
use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminCrud;
78
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
89
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
910
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
@@ -13,6 +14,7 @@
1314
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
1415
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
1516

17+
#[AdminCrud(routePath: '/users', routeName: 'dashboard_users')]
1618
class DashboardUserController extends AbstractCrudController
1719
{
1820
public static function getEntityFqcn(): string

src/EventListener/DashboardRoutingListener.php

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,24 @@
22

33
namespace CodedMonkey\Dirigent\EventListener;
44

5-
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
5+
use CodedMonkey\Dirigent\Controller\Dashboard\DashboardRootController;
6+
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA;
67
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
7-
use Symfony\Component\HttpFoundation\RedirectResponse;
8-
use Symfony\Component\HttpFoundation\Response;
98
use Symfony\Component\HttpKernel\Event\RequestEvent;
109

1110
/**
12-
* Redirects requests to Symfony routes of dashboard to EasyAdmin routes.
11+
* Fakes dashboard routes are created by EasyAdmin to use EasyAdmin template functions.
1312
*/
1413
readonly class DashboardRoutingListener
1514
{
16-
public function __construct(
17-
private AdminUrlGenerator $adminUrlGenerator,
18-
) {
19-
}
20-
21-
#[AsEventListener]
15+
#[AsEventListener(priority: 10)]
2216
public function redirectPrettyDashboardUrls(RequestEvent $event): void
2317
{
2418
$request = $event->getRequest();
2519

26-
if (str_starts_with($request->getPathInfo(), '/dashboard/')) {
27-
$url = $this->adminUrlGenerator->setRoute($request->attributes->get('_route'), $request->attributes->get('_route_params'))->generateUrl();
28-
$response = new RedirectResponse($url, Response::HTTP_MOVED_PERMANENTLY);
29-
30-
$event->setResponse($response);
20+
if (str_starts_with($request->attributes->get('_route'), 'dashboard_')) {
21+
$request->attributes->set(EA::ROUTE_CREATED_BY_EASYADMIN, true);
22+
$request->attributes->set(EA::DASHBOARD_CONTROLLER_FQCN, DashboardRootController::class);
3123
}
3224
}
3325
}

tests/FunctionalTests/DashboardPackagesControllerTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public function testStatistics(): void
1515
$client = static::createClient();
1616
$this->loginUser();
1717

18-
$client->request('GET', '/?routeName=dashboard_packages_statistics&routeParams[packageName]=psr/log');
18+
$client->request('GET', '/packages/psr/log/statistics');
1919

2020
$this->assertResponseStatusCodeSame(200);
2121

@@ -37,7 +37,7 @@ public function testAddMirroring(): void
3737

3838
$registry = $client->getContainer()->get(RegistryRepository::class)->findOneBy(['name' => 'Packagist']);
3939

40-
$client->request('GET', '/?routeName=dashboard_packages_add_mirroring');
40+
$client->request('GET', '/packages/add-mirroring');
4141
$client->submitForm('Add packages', [
4242
'package_add_mirroring_form[packages]' => 'psr/cache',
4343
'package_add_mirroring_form[registry]' => $registry->getId(),
@@ -67,7 +67,7 @@ public function testAddVcsRepository(): void
6767
$client = static::createClient();
6868
$this->loginUser('admin');
6969

70-
$client->request('GET', '/?routeName=dashboard_packages_add_vcs');
70+
$client->request('GET', '/packages/add-vcs');
7171
$client->submitForm('Add VCS repository', [
7272
'package_add_vcs_form[repositoryUrl]' => 'https://github.com/php-fig/container',
7373
]);
@@ -88,7 +88,7 @@ public function testEdit(): void
8888
$client = static::createClient();
8989
$this->loginUser('admin');
9090

91-
$client->request('GET', '/?routeName=dashboard_packages_edit&routeParams[packageName]=psr/log');
91+
$client->request('GET', '/packages/psr/log/edit');
9292
$client->submitForm('Save changes');
9393

9494
$this->assertResponseStatusCodeSame(302);

0 commit comments

Comments
 (0)