From 043657e02159362fc5d83ab92a05b0937cc0d2db Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Fri, 16 Oct 2026 11:24:30 +0200 Subject: [PATCH 1/2] #172 - Prefix the route names of the bundle with cleverage_ui_process_ - Rename the explicit routes: cleverage_ui_process_login, _logout, _list, _launch and _http_execute, used by the bundle (security configuration, HTTP authenticator, controllers, menu, templates). - The former names are deprecated route aliases since 3.3 (config/routes/deprecated_aliases.yaml, loaded by the documented config/routes/*.yaml import), removed in 4.0: generating a URL with them and ?routeName= URLs keep working. - The dashboard route (process) and the EasyAdmin routes generated from it are unchanged: no alias possible for the generated routes, renamed in 4.0. - Docs: route names, former names, the easyadmin.routes loader generates the routes of every dashboard (a prefix on the import also applies to the application dashboards); UPGRADE.md. Co-Authored-By: Claude Opus 5.5 (1M context) --- CHANGELOG.md | 1 + UPGRADE.md | 19 ++++++ config/routes/deprecated_aliases.yaml | 37 +++++++++++ docs/reference/03-users_and_security.md | 48 ++++++++------ docs/reference/06-http_api.md | 4 +- src/Controller/Admin/Process/LaunchAction.php | 8 +-- src/Controller/Admin/Process/ListAction.php | 4 +- .../Admin/ProcessDashboardController.php | 2 +- .../Admin/Security/LoginController.php | 2 +- .../Admin/Security/LogoutController.php | 4 +- src/Controller/ProcessExecuteController.php | 2 +- .../CleverAgeUiProcessExtension.php | 8 +-- .../HttpProcessExecutionAuthenticator.php | 2 +- templates/admin/process/list.html.twig | 4 +- .../Admin/Security/LogoutControllerTest.php | 2 +- .../CleverAgeUiProcessExtensionTest.php | 4 +- tests/Functional/LaunchActionTest.php | 16 ++--- tests/Functional/ProcessListTest.php | 23 +++++-- tests/Functional/RouteNamesTest.php | 65 +++++++++++++++++++ tests/Functional/SecurityTest.php | 4 +- .../HttpProcessExecutionAuthenticatorTest.php | 8 +-- 21 files changed, 206 insertions(+), 61 deletions(-) create mode 100644 config/routes/deprecated_aliases.yaml create mode 100644 tests/Functional/RouteNamesTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 54ea5e2..a192521 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Latest ------ ## Changes +* [#172](https://github.com/cleverage/ui-process-bundle/issues/172) Prefix the route names of the bundle with `cleverage_ui_process_`, as required by the Symfony best practices for bundles: `cleverage_ui_process_login`, `cleverage_ui_process_logout`, `cleverage_ui_process_list`, `cleverage_ui_process_launch`, `cleverage_ui_process_http_execute`. The former names (`process_login`, `process_logout`, `process_list`, `process_launch`, `http_process_execute`) are deprecated route aliases (new `config/routes/deprecated_aliases.yaml`, loaded by the documented import), removed in 4.0; `?routeName=` URLs keep working. The dashboard route (`process`) and the EasyAdmin routes generated from it will be renamed in 4.0. Document that `easyadmin.routes` generates the routes of every dashboard. Update documentation and UPGRADE.md, add tests. * [#166](https://github.com/cleverage/ui-process-bundle/issues/166) Doctrine ORM 2: the entities have readonly properties (since v3.2), which the legacy proxies of ORM 2 cannot handle (`Cannot unset readonly property ... from scope Proxies\__CG__\...` when an entity proxy is loaded). The container compilation now fails with an explicit message when ORM 2 is used without `doctrine.orm.enable_lazy_ghost_objects: true` (new internal `CheckDoctrineLazyGhostObjectsPass`); nothing changes with ORM 3. Update documentation, add tests. * [#164](https://github.com/cleverage/ui-process-bundle/issues/164) Require `symfony/polyfill-php83`, `symfony/polyfill-php84` and `symfony/polyfill-php85`: the functions of PHP 8.3 to 8.5 (`json_validate()`, `array_find()`, `array_first()`...) can be used while supporting PHP 8.2 (see `CONTRIBUTING.md`). Rector is configured for PHP 8.2 (was 8.5, which allowed it to introduce PHP 8.3+ functions without polyfill) with the `PHP_POLYFILLS` set (`withPhpSets()` without argument), it does not change the code. `array_last()` replaces `end()` in a test. Tests: lazy ghost proxies with Doctrine ORM 2 (now installed by the lowest dependencies job), as configured by the Symfony recipe: the legacy proxies cannot unset the readonly properties of the entities. * [#158](https://github.com/cleverage/ui-process-bundle/issues/158) CI: test the lowest versions allowed by `composer.json` (`--prefer-lowest`, PHP 8.2). Require `symfony/scheduler` ^6.4.44 || ^7.4.17 || ^8.1.5: the `every` expressions validation (`EveryExpressionValidator`) relies on the `PeriodicalTrigger` rejecting the intervals that do not move the run date forward or resolve to zero seconds (older versions loop forever on e.g. "yesterday", and fail with a `TypeError` on an invalid expression). `ProcessExecutionDurationFilter`: the number of seconds is cast to an integer and inlined in the DQL instead of being bound as a parameter (#111): with DBAL 3, the SQLite platform puts the `SECOND` intervals inside a string literal, so the parameter was never bound ("column index out of range" error on SQLite with DBAL 3). diff --git a/UPGRADE.md b/UPGRADE.md index cff141b..ca051e0 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -1,6 +1,25 @@ Upgrade Guide ============= +## v3.3 + +### Route names + +The routes of the bundle are prefixed with `cleverage_ui_process_`. The former names are deprecated aliases, removed in +4.0: update the references in your application (`path()` / `url()`, `redirectToRoute()`, security configuration when +`security.configure_firewall` is `false`...). + +| Before (deprecated) | After | +|------------------------|-------------------------------------| +| `process_login` | `cleverage_ui_process_login` | +| `process_logout` | `cleverage_ui_process_logout` | +| `process_list` | `cleverage_ui_process_list` | +| `process_launch` | `cleverage_ui_process_launch` | +| `http_process_execute` | `cleverage_ui_process_http_execute` | + +The dashboard route (`process`) and the EasyAdmin routes generated from it (`process__`) are unchanged, +they will be renamed in 4.0. + ## v3.0 ### Import routes diff --git a/config/routes/deprecated_aliases.yaml b/config/routes/deprecated_aliases.yaml new file mode 100644 index 0000000..f464ab0 --- /dev/null +++ b/config/routes/deprecated_aliases.yaml @@ -0,0 +1,37 @@ +# Former names of the routes of the bundle, deprecated since 3.3: use the cleverage_ui_process_* names +# The dashboard route ("process") and the EasyAdmin routes generated from it ("process_*") will be renamed in 4.0 + +process_login: + alias: cleverage_ui_process_login + deprecated: + package: 'cleverage/ui-process-bundle' + version: '3.3' + message: 'The "%alias_id%" route alias is deprecated, use the "cleverage_ui_process_login" route instead. It will be removed in 4.0.' + +process_logout: + alias: cleverage_ui_process_logout + deprecated: + package: 'cleverage/ui-process-bundle' + version: '3.3' + message: 'The "%alias_id%" route alias is deprecated, use the "cleverage_ui_process_logout" route instead. It will be removed in 4.0.' + +process_list: + alias: cleverage_ui_process_list + deprecated: + package: 'cleverage/ui-process-bundle' + version: '3.3' + message: 'The "%alias_id%" route alias is deprecated, use the "cleverage_ui_process_list" route instead. It will be removed in 4.0.' + +process_launch: + alias: cleverage_ui_process_launch + deprecated: + package: 'cleverage/ui-process-bundle' + version: '3.3' + message: 'The "%alias_id%" route alias is deprecated, use the "cleverage_ui_process_launch" route instead. It will be removed in 4.0.' + +http_process_execute: + alias: cleverage_ui_process_http_execute + deprecated: + package: 'cleverage/ui-process-bundle' + version: '3.3' + message: 'The "%alias_id%" route alias is deprecated, use the "cleverage_ui_process_http_execute" route instead. It will be removed in 4.0.' diff --git a/docs/reference/03-users_and_security.md b/docs/reference/03-users_and_security.md index c322339..63c8c0b 100644 --- a/docs/reference/03-users_and_security.md +++ b/docs/reference/03-users_and_security.md @@ -18,11 +18,11 @@ security: provider: process_user_provider custom_authenticator: [cleverage_ui_process.security.http_process_execution_authenticator] form_login: - login_path: process_login - check_path: process_login + login_path: cleverage_ui_process_login + check_path: cleverage_ui_process_login logout: - path: process_logout - target: process_login + path: cleverage_ui_process_logout + target: cleverage_ui_process_login clear_site_data: '*' ``` @@ -51,10 +51,10 @@ environment variable): the bundle no longer adds any `security` configuration, n firewall. Configure them in your application, on the firewall and with the provider of your choice. The UI requires: - a user provider of the `CleverAge\UiProcessBundle\Entity\User` entity, by `email`; -- a firewall covering the UI routes, with a login form on the `process_login` route and the logout on the - `process_logout` route; +- a firewall covering the UI routes, with a login form on the `cleverage_ui_process_login` route and the logout on the + `cleverage_ui_process_logout` route; - the `cleverage_ui_process.security.http_process_execution_authenticator` authenticator on the firewall covering the - `http_process_execute` route, for the [HTTP API](06-http_api.md). + `cleverage_ui_process_http_execute` route, for the [HTTP API](06-http_api.md). For instance, with the same behaviour as the bundle configuration on a firewall dedicated to the UI: @@ -79,11 +79,11 @@ security: provider: process_user_provider custom_authenticator: [cleverage_ui_process.security.http_process_execution_authenticator] form_login: - login_path: process_login - check_path: process_login + login_path: cleverage_ui_process_login + check_path: cleverage_ui_process_login logout: - path: process_logout - target: process_login + path: cleverage_ui_process_logout + target: cleverage_ui_process_login clear_site_data: '*' main: # ... your application firewall @@ -132,11 +132,21 @@ Routes Routes are imported with `@CleverAgeUiProcessBundle/config/routes/*.yaml` (see [installation](../index.md#import-routes)). -| Route name | Path | Description | -|------------------------------|---------------------------------|----------------------------------------------------------------------------------------------| -| `process` | `/process` | EasyAdmin dashboard, redirects to the executions list. CRUD pages are sub-routes of it. | -| `process_login` | `/process/login` | Login form. | -| `process_logout` | `/process/logout` | Logout. | -| `process_list` | `/process/list` | List of public processes. | -| `process_launch` | `/process/launch?process=` | Launch a process (confirmation, form or direct, see [launch modes](02-process_ui_options.md#launch-modes)). | -| `http_process_execute` | `/http/process/execute` (POST) | [HTTP API](06-http_api.md). | +| Route name | Former name (deprecated) | Path | Description | +|-------------------------------------|--------------------------|----------------------------------|----------------------------------------------------------------------------------------------| +| `process` | | `/process` | EasyAdmin dashboard, redirects to the executions list. CRUD pages are sub-routes of it. | +| `cleverage_ui_process_login` | `process_login` | `/process/login` | Login form. | +| `cleverage_ui_process_logout` | `process_logout` | `/process/logout` | Logout. | +| `cleverage_ui_process_list` | `process_list` | `/process/list` | List of public processes. | +| `cleverage_ui_process_launch` | `process_launch` | `/process/launch?process=` | Launch a process (confirmation, form or direct, see [launch modes](02-process_ui_options.md#launch-modes)). | +| `cleverage_ui_process_http_execute` | `http_process_execute` | `/http/process/execute` (POST) | [HTTP API](06-http_api.md). | + +The former route names are deprecated aliases since 3.3 (`config/routes/deprecated_aliases.yaml`), removed in 4.0: +generating a URL with them, or opening a `?routeName=` URL of the dashboard, still works and triggers a +deprecation. The dashboard route (`process`) and the EasyAdmin routes generated from it (`process__`) +will be renamed in 4.0. + +The EasyAdmin routes (the dashboard and its CRUD pages) are generated by the `easyadmin.routes` loader imported by +`config/routes/easyadmin.yaml`. This loader generates the routes of **every** dashboard, including the ones of your +application: a `prefix` set on the import of the bundle routes also applies to the dashboards of your application, and +`easyadmin.routes` must not be imported a second time. diff --git a/docs/reference/06-http_api.md b/docs/reference/06-http_api.md index de6f79d..05523fa 100644 --- a/docs/reference/06-http_api.md +++ b/docs/reference/06-http_api.md @@ -1,12 +1,12 @@ HTTP API ======== -A process can be launched from another application with an HTTP `POST` request on the `http_process_execute` route. +A process can be launched from another application with an HTTP `POST` request on the `cleverage_ui_process_http_execute` route. Endpoint -------- -* **Route**: `http_process_execute` +* **Route**: `cleverage_ui_process_http_execute` * **Path**: `/http/process/execute` * **Method**: `POST` * **Authentication**: `Authorization: Bearer ` header diff --git a/src/Controller/Admin/Process/LaunchAction.php b/src/Controller/Admin/Process/LaunchAction.php index 3d9f5e2..19d8e13 100644 --- a/src/Controller/Admin/Process/LaunchAction.php +++ b/src/Controller/Admin/Process/LaunchAction.php @@ -34,7 +34,7 @@ #[Route( '/process/launch', - name: 'process_launch', + name: 'cleverage_ui_process_launch', requirements: ['process' => '\w+'], methods: ['POST', 'GET'] )] @@ -54,7 +54,7 @@ public function __invoke( ): Response { // Accessed directly, not through the dashboard: the template needs the EasyAdmin context if (!$this->adminContextProvider->getContext() instanceof AdminContextInterface) { - return $this->redirectToRoute('process', ['routeName' => 'process_launch'] + ($this->requestStack->getMainRequest()?->query->all() ?? [])); + return $this->redirectToRoute('process', ['routeName' => 'cleverage_ui_process_launch'] + ($this->requestStack->getMainRequest()?->query->all() ?? [])); } $processCode = (string) $this->requestStack->getMainRequest()?->query->get('process'); if ('' === $processCode) { @@ -71,7 +71,7 @@ public function __invoke( 'Process has been added to queue. It will start as soon as possible' ); - return $this->redirectToRoute('process', ['routeName' => 'process_list']); + return $this->redirectToRoute('process', ['routeName' => 'cleverage_ui_process_list']); } $form = $this->createForm( LaunchType::class, @@ -108,7 +108,7 @@ public function __invoke( 'Process has been added to queue. It will start as soon as possible' ); - return $this->redirectToRoute('process', ['routeName' => 'process_list']); + return $this->redirectToRoute('process', ['routeName' => 'cleverage_ui_process_list']); } $this->adminContextProvider->getContext()->getAssets()->addJsAsset(Asset::fromEasyAdminAssetPackage('field-collection.js')->getAsDto()); diff --git a/src/Controller/Admin/Process/ListAction.php b/src/Controller/Admin/Process/ListAction.php index 0355ed2..bd597cf 100644 --- a/src/Controller/Admin/Process/ListAction.php +++ b/src/Controller/Admin/Process/ListAction.php @@ -22,7 +22,7 @@ use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Security\Http\Attribute\IsGranted; -#[Route('/process/list', name: 'process_list')] +#[Route('/process/list', name: 'cleverage_ui_process_list')] #[IsGranted('ROLE_USER')] class ListAction extends AbstractController { @@ -37,7 +37,7 @@ public function __invoke(): Response { // Accessed directly, not through the dashboard: the template needs the EasyAdmin context if (!$this->adminContextProvider->getContext() instanceof AdminContextInterface) { - return $this->redirectToRoute('process', ['routeName' => 'process_list']); + return $this->redirectToRoute('process', ['routeName' => 'cleverage_ui_process_list']); } return $this->render( diff --git a/src/Controller/Admin/ProcessDashboardController.php b/src/Controller/Admin/ProcessDashboardController.php index e9dcc70..24922dd 100644 --- a/src/Controller/Admin/ProcessDashboardController.php +++ b/src/Controller/Admin/ProcessDashboardController.php @@ -60,7 +60,7 @@ public function configureMenuItems(): iterable yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home'); yield MenuItem::subMenu('Process', 'fas fa-gear')->setSubItems( [ - MenuItem::linkToRoute('Process list', 'fas fa-list', 'process_list'), + MenuItem::linkToRoute('Process list', 'fas fa-list', 'cleverage_ui_process_list'), MenuItem::linkTo(ProcessExecutionCrudController::class, 'Executions', 'fas fa-rocket'), MenuItem::linkTo(LogRecordCrudController::class, 'Logs', 'fas fa-pen'), MenuItem::linkTo(ProcessScheduleCrudController::class, 'Scheduler', 'fas fa-solid fa-clock'), diff --git a/src/Controller/Admin/Security/LoginController.php b/src/Controller/Admin/Security/LoginController.php index e33b149..170fd33 100644 --- a/src/Controller/Admin/Security/LoginController.php +++ b/src/Controller/Admin/Security/LoginController.php @@ -20,7 +20,7 @@ class LoginController extends AbstractController { - #[Route('/process/login', name: 'process_login')] + #[Route('/process/login', name: 'cleverage_ui_process_login')] public function __invoke(AuthenticationUtils $authenticationUtils): Response { return $this->render( diff --git a/src/Controller/Admin/Security/LogoutController.php b/src/Controller/Admin/Security/LogoutController.php index ecfd5ce..f032936 100644 --- a/src/Controller/Admin/Security/LogoutController.php +++ b/src/Controller/Admin/Security/LogoutController.php @@ -24,11 +24,11 @@ public function __construct(private readonly Security $security) { } - #[Route('/process/logout', name: 'process_logout')] + #[Route('/process/logout', name: 'cleverage_ui_process_logout')] public function __invoke(): Response { $this->security->logout(); - return $this->redirectToRoute('process_login'); + return $this->redirectToRoute('cleverage_ui_process_login'); } } diff --git a/src/Controller/ProcessExecuteController.php b/src/Controller/ProcessExecuteController.php index 8f95310..ab4d17c 100644 --- a/src/Controller/ProcessExecuteController.php +++ b/src/Controller/ProcessExecuteController.php @@ -29,7 +29,7 @@ use Symfony\Component\Validator\Validator\ValidatorInterface; #[IsGranted('ROLE_USER')] -#[Route(path: '/http/process/execute', name: 'http_process_execute', methods: ['POST'])] +#[Route(path: '/http/process/execute', name: 'cleverage_ui_process_http_execute', methods: ['POST'])] class ProcessExecuteController extends AbstractController { public function __construct( diff --git a/src/DependencyInjection/CleverAgeUiProcessExtension.php b/src/DependencyInjection/CleverAgeUiProcessExtension.php index 5d232da..2e57df3 100644 --- a/src/DependencyInjection/CleverAgeUiProcessExtension.php +++ b/src/DependencyInjection/CleverAgeUiProcessExtension.php @@ -240,12 +240,12 @@ private function configureSecurity(ContainerBuilder $container): void 'provider' => 'process_user_provider', 'custom_authenticator' => ['cleverage_ui_process.security.http_process_execution_authenticator'], 'form_login' => [ - 'login_path' => 'process_login', - 'check_path' => 'process_login', + 'login_path' => 'cleverage_ui_process_login', + 'check_path' => 'cleverage_ui_process_login', ], 'logout' => [ - 'path' => 'process_logout', - 'target' => 'process_login', + 'path' => 'cleverage_ui_process_logout', + 'target' => 'cleverage_ui_process_login', 'clear_site_data' => '*', ], ], diff --git a/src/Security/HttpProcessExecutionAuthenticator.php b/src/Security/HttpProcessExecutionAuthenticator.php index 6aea431..9ee0b09 100644 --- a/src/Security/HttpProcessExecutionAuthenticator.php +++ b/src/Security/HttpProcessExecutionAuthenticator.php @@ -34,7 +34,7 @@ public function __construct(private readonly EntityManagerInterface $entityManag public function supports(Request $request): ?bool { - return 'http_process_execute' === $request->attributes->get('_route') && $request->isMethod(Request::METHOD_POST); + return 'cleverage_ui_process_http_execute' === $request->attributes->get('_route') && $request->isMethod(Request::METHOD_POST); } public function authenticate(Request $request): Passport diff --git a/templates/admin/process/list.html.twig b/templates/admin/process/list.html.twig index 54f5b16..6e58314 100644 --- a/templates/admin/process/list.html.twig +++ b/templates/admin/process/list.html.twig @@ -40,7 +40,7 @@ {% else %} - + {% endif %} @@ -71,7 +71,7 @@ id="{{ process.code }}" title="{{ 'Run process'|trans }} {{ process.code }}" message="{{ 'Do you really want to run process %process% in background'|trans({'%process%': process.code}) }} ?" - confirmUrl="{{ url('process', {routeName: 'process_launch', process: process.code}) }}" + confirmUrl="{{ url('process', {routeName: 'cleverage_ui_process_launch', process: process.code}) }}" /> {% endfor %} {% endblock %} diff --git a/tests/Controller/Admin/Security/LogoutControllerTest.php b/tests/Controller/Admin/Security/LogoutControllerTest.php index 6771c0f..82f8b35 100644 --- a/tests/Controller/Admin/Security/LogoutControllerTest.php +++ b/tests/Controller/Admin/Security/LogoutControllerTest.php @@ -34,7 +34,7 @@ public function testLogout(): void $security = $this->createMock(Security::class); $security->expects(self::once())->method('logout'); $router = $this->createStub(RouterInterface::class); - $router->method('generate')->willReturnCallback(static fn (string $route, array $parameters, int $type): string => UrlGeneratorInterface::ABSOLUTE_PATH === $type && 'process_login' === $route ? '/process/login' : ''); + $router->method('generate')->willReturnCallback(static fn (string $route, array $parameters, int $type): string => UrlGeneratorInterface::ABSOLUTE_PATH === $type && 'cleverage_ui_process_login' === $route ? '/process/login' : ''); $container = new Container(); $container->set('router', $router); diff --git a/tests/DependencyInjection/CleverAgeUiProcessExtensionTest.php b/tests/DependencyInjection/CleverAgeUiProcessExtensionTest.php index 528a3d5..30b9971 100644 --- a/tests/DependencyInjection/CleverAgeUiProcessExtensionTest.php +++ b/tests/DependencyInjection/CleverAgeUiProcessExtensionTest.php @@ -297,8 +297,8 @@ public function testPrepend(): void 'main' => [ 'provider' => 'process_user_provider', 'custom_authenticator' => ['cleverage_ui_process.security.http_process_execution_authenticator'], - 'form_login' => ['login_path' => 'process_login', 'check_path' => 'process_login'], - 'logout' => ['path' => 'process_logout', 'target' => 'process_login', 'clear_site_data' => '*'], + 'form_login' => ['login_path' => 'cleverage_ui_process_login', 'check_path' => 'cleverage_ui_process_login'], + 'logout' => ['path' => 'cleverage_ui_process_logout', 'target' => 'cleverage_ui_process_login', 'clear_site_data' => '*'], ], ], $security[0]['firewalls'] diff --git a/tests/Functional/LaunchActionTest.php b/tests/Functional/LaunchActionTest.php index 749eb26..1834828 100644 --- a/tests/Functional/LaunchActionTest.php +++ b/tests/Functional/LaunchActionTest.php @@ -77,10 +77,10 @@ public function testLaunchWithoutForm(): void { $this->login(); - $this->client->request('GET', '/process?routeName=process_launch&process=test.process'); + $this->client->request('GET', '/process?routeName=cleverage_ui_process_launch&process=test.process'); self::assertResponseRedirects(); - self::assertStringContainsString('routeName=process_list', (string) $this->client->getResponse()->headers->get('Location')); + self::assertStringContainsString('routeName=cleverage_ui_process_list', (string) $this->client->getResponse()->headers->get('Location')); $messages = $this->getDispatchedMessages(); self::assertCount(1, $messages); self::assertSame('test.process', $messages[0]->code); @@ -95,7 +95,7 @@ public function testLaunchWithForm(): void { $this->login(); - $crawler = $this->client->request('GET', '/process?routeName=process_launch&process=test.form'); + $crawler = $this->client->request('GET', '/process?routeName=cleverage_ui_process_launch&process=test.form'); self::assertResponseIsSuccessful(); self::assertSame([], $this->getDispatchedMessages()); @@ -125,7 +125,7 @@ public function testLaunchWithFileUpload(): void file_put_contents((string) $file, 'line1'); // test.upload has no "default" UI option: the form must be displayed with empty default values - $crawler = $this->client->request('GET', '/process?routeName=process_launch&process=test.upload'); + $crawler = $this->client->request('GET', '/process?routeName=cleverage_ui_process_launch&process=test.upload'); self::assertResponseIsSuccessful(); self::assertCount(0, $crawler->filter('input[name^="launch[context]"]')); self::assertCount(1, $crawler->filter('input[type="file"][name="launch[input]"]')); @@ -159,7 +159,7 @@ public function testContextRowWithoutKey(): void { $this->login(); - $crawler = $this->client->request('GET', '/process?routeName=process_launch&process=test.form_constraints'); + $crawler = $this->client->request('GET', '/process?routeName=cleverage_ui_process_launch&process=test.form_constraints'); self::assertResponseIsSuccessful(); $form = $crawler->selectButton('Launch')->form(); /** @var array> $values */ @@ -177,7 +177,7 @@ public function testMissingProcessCode(): void { $this->login(); - $this->client->request('GET', '/process?routeName=process_launch'); + $this->client->request('GET', '/process?routeName=cleverage_ui_process_launch'); self::assertResponseStatusCodeSame(500); } @@ -186,7 +186,7 @@ public function testUnknownProcess(): void { $this->login(); - $this->client->request('GET', '/process?routeName=process_launch&process=unknown'); + $this->client->request('GET', '/process?routeName=cleverage_ui_process_launch&process=unknown'); self::assertResponseStatusCodeSame(500); self::assertSame([], $this->getDispatchedMessages()); @@ -202,7 +202,7 @@ public function testDirectAccessRedirectsToTheDashboard(): void $this->client->request('GET', '/process/launch?process=test.form'); - self::assertResponseRedirects('/process?routeName=process_launch&process=test.form'); + self::assertResponseRedirects('/process?routeName=cleverage_ui_process_launch&process=test.form'); $crawler = $this->client->followRedirect(); self::assertResponseIsSuccessful(); self::assertCount(1, $crawler->filter('input[name="launch[input]"]')); diff --git a/tests/Functional/ProcessListTest.php b/tests/Functional/ProcessListTest.php index 6dc0815..d0d425a 100644 --- a/tests/Functional/ProcessListTest.php +++ b/tests/Functional/ProcessListTest.php @@ -78,7 +78,7 @@ public function testPublicProcessesAreListed(): void { $this->login(); - $crawler = $this->client->request('GET', '/process?routeName=process_list'); + $crawler = $this->client->request('GET', '/process?routeName=cleverage_ui_process_list'); self::assertResponseIsSuccessful(); $text = $crawler->filter('table')->text(); @@ -87,16 +87,29 @@ public function testPublicProcessesAreListed(): void self::assertStringNotContainsString('test.private', $text); } - public function testUsersMenuIsReservedToAdmins(): void + /** + * The URLs built with the former route name (e.g. bookmarks) keep working: the route alias is deprecated. + */ + public function testDeprecatedRouteName(): void { $this->login(); + $crawler = $this->client->request('GET', '/process?routeName=process_list'); + + self::assertResponseIsSuccessful(); + self::assertStringContainsString('test.process', $crawler->filter('table')->text()); + } + + public function testUsersMenuIsReservedToAdmins(): void + { + $this->login(); + $crawler = $this->client->request('GET', '/process?routeName=cleverage_ui_process_list'); self::assertStringNotContainsString('User List', $crawler->filter('nav, aside, .sidebar, body')->first()->text()); $this->client->restart(); $this->client->disableReboot(); $this->client->loginUser($this->createUser('admin@example.com', ['ROLE_ADMIN']), 'main'); - $crawler = $this->client->request('GET', '/process?routeName=process_list'); + $crawler = $this->client->request('GET', '/process?routeName=cleverage_ui_process_list'); self::assertStringContainsString('User List', $crawler->filter('body')->text()); } @@ -107,7 +120,7 @@ public function testUserLocale(): void $this->getEntityManager()->flush(); $this->client->loginUser($user, 'main'); - $crawler = $this->client->request('GET', '/process?routeName=process_list'); + $crawler = $this->client->request('GET', '/process?routeName=cleverage_ui_process_list'); self::assertResponseIsSuccessful(); // EasyAdmin labels translated in the user locale @@ -124,7 +137,7 @@ public function testDirectAccessRedirectsToTheDashboard(): void $this->client->request('GET', '/process/list'); - self::assertResponseRedirects('/process?routeName=process_list'); + self::assertResponseRedirects('/process?routeName=cleverage_ui_process_list'); $this->client->followRedirect(); self::assertResponseIsSuccessful(); } diff --git a/tests/Functional/RouteNamesTest.php b/tests/Functional/RouteNamesTest.php new file mode 100644 index 0000000..6fdad5e --- /dev/null +++ b/tests/Functional/RouteNamesTest.php @@ -0,0 +1,65 @@ + + */ + public static function provideRoutes(): iterable + { + yield 'login' => ['cleverage_ui_process_login', 'process_login', '/process/login']; + yield 'logout' => ['cleverage_ui_process_logout', 'process_logout', '/process/logout']; + yield 'process list' => ['cleverage_ui_process_list', 'process_list', '/process/list']; + yield 'process launch' => ['cleverage_ui_process_launch', 'process_launch', '/process/launch']; + yield 'HTTP API' => ['cleverage_ui_process_http_execute', 'http_process_execute', '/http/process/execute', 'POST']; + } + + #[DataProvider('provideRoutes')] + public function testRoute(string $name, string $formerName, string $path, string $method = 'GET'): void + { + $router = static::getContainer()->get('router'); + self::assertInstanceOf(Router::class, $router); + + self::assertSame($path, $router->generate($name)); + self::assertSame($name, $router->matchRequest(Request::create($path, $method))['_route'] ?? null); + + $deprecations = []; + set_error_handler(static function (int $errno, string $errstr) use (&$deprecations): bool { + $deprecations[] = $errstr; + + return true; + }, \E_USER_DEPRECATED); + try { + self::assertSame($path, $router->generate($formerName)); + } finally { + restore_error_handler(); + } + self::assertContains( + \sprintf('Since cleverage/ui-process-bundle 3.3: The "%s" route alias is deprecated, use the "%s" route instead. It will be removed in 4.0.', $formerName, $name), + $deprecations + ); + } +} diff --git a/tests/Functional/SecurityTest.php b/tests/Functional/SecurityTest.php index 58db9bb..a25c9da 100644 --- a/tests/Functional/SecurityTest.php +++ b/tests/Functional/SecurityTest.php @@ -84,8 +84,8 @@ class SecurityTest extends FunctionalTestCase public static function provideProtectedUrls(): iterable { yield 'dashboard' => ['/process']; - yield 'process list' => ['/process?routeName=process_list']; - yield 'process launch' => ['/process?routeName=process_launch&process=test.process']; + yield 'process list' => ['/process?routeName=cleverage_ui_process_list']; + yield 'process launch' => ['/process?routeName=cleverage_ui_process_launch&process=test.process']; yield 'executions' => ['/process/process-execution']; yield 'logs' => ['/process/log-record']; yield 'scheduler' => ['/process/process-schedule']; diff --git a/tests/Security/HttpProcessExecutionAuthenticatorTest.php b/tests/Security/HttpProcessExecutionAuthenticatorTest.php index 2065ddb..c27ee6b 100644 --- a/tests/Security/HttpProcessExecutionAuthenticatorTest.php +++ b/tests/Security/HttpProcessExecutionAuthenticatorTest.php @@ -25,7 +25,7 @@ class HttpProcessExecutionAuthenticatorTest extends TestCase public function testSupportsHttpProcessExecuteRoute(): void { $request = Request::create('/http/process/execute', Request::METHOD_POST); - $request->attributes->set('_route', 'http_process_execute'); + $request->attributes->set('_route', 'cleverage_ui_process_http_execute'); self::assertTrue($this->createAuthenticator()->supports($request)); } @@ -33,15 +33,15 @@ public function testSupportsHttpProcessExecuteRoute(): void public function testDoesNotSupportGetRequest(): void { $request = Request::create('/http/process/execute', Request::METHOD_GET); - $request->attributes->set('_route', 'http_process_execute'); + $request->attributes->set('_route', 'cleverage_ui_process_http_execute'); self::assertFalse($this->createAuthenticator()->supports($request)); } public function testDoesNotSupportOtherRoutes(): void { - $request = Request::create('/process', Request::METHOD_POST, ['_route' => 'http_process_execute']); - $request->attributes->set('_route', 'process_list'); + $request = Request::create('/process', Request::METHOD_POST, ['_route' => 'cleverage_ui_process_http_execute']); + $request->attributes->set('_route', 'cleverage_ui_process_list'); self::assertFalse($this->createAuthenticator()->supports($request)); } From cf8dd1d7789a8bf36557e89b4aa60dcc9368d44f Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Fri, 16 Oct 2026 11:43:41 +0200 Subject: [PATCH 2/2] #172 - Prefix the dashboard route and the routes generated by EasyAdmin - Dashboard route: cleverage_ui_process (was process), so that the routes generated by EasyAdmin for the CRUD pages are cleverage_ui_process__ (were process__). - Their former names are deprecated aliases (3.3, removed in 4.0), added by the new internal DeprecatedEasyAdminRouteAliasLoader (routing loader imported by config/routes/deprecated_aliases.yaml): it imports the easyadmin.routes routes to know the names of the routes of the dashboard of the bundle (routes of the other dashboards are ignored), and returns the aliases only. - The functional tests declare the loader (executed when the routes are loaded by the first test). - Docs and UPGRADE.md: dashboard and generated routes. Co-Authored-By: Claude Opus 5.5 (1M context) --- CHANGELOG.md | 2 +- UPGRADE.md | 22 ++--- config/routes/deprecated_aliases.yaml | 8 +- config/services/routing.yaml | 6 ++ docs/reference/03-users_and_security.md | 9 +- src/Controller/Admin/Process/LaunchAction.php | 6 +- src/Controller/Admin/Process/ListAction.php | 2 +- .../Admin/ProcessDashboardController.php | 2 +- .../Admin/Security/LoginController.php | 2 +- .../DeprecatedEasyAdminRouteAliasLoader.php | 63 ++++++++++++++ templates/admin/process/list.html.twig | 6 +- tests/CleverAgeUiProcessBundleTest.php | 2 + tests/Functional/HttpProcessExecuteTest.php | 2 + tests/Functional/LaunchActionTest.php | 2 + tests/Functional/LogRecordCrudTest.php | 2 + tests/Functional/ProcessExecutionCrudTest.php | 2 + .../ProcessExecutionNotificationTest.php | 2 + tests/Functional/ProcessListTest.php | 2 + tests/Functional/ProcessScheduleCrudTest.php | 2 + tests/Functional/PurgeLogsCommandTest.php | 2 + tests/Functional/RouteNamesTest.php | 19 ++-- tests/Functional/SecurityTest.php | 2 + tests/Functional/UserCrudTest.php | 2 + ...ocessExecutionManagerEntityManagerTest.php | 2 + ...octrineProcessHandlerEntityManagerTest.php | 2 + .../ProcessExecutionRepositoryTest.php | 2 + .../ProcessScheduleRepositoryTest.php | 2 + ...eprecatedEasyAdminRouteAliasLoaderTest.php | 87 +++++++++++++++++++ .../ProcessExecutionStopCheckerTest.php | 2 + 29 files changed, 235 insertions(+), 31 deletions(-) create mode 100644 config/services/routing.yaml create mode 100644 src/Routing/DeprecatedEasyAdminRouteAliasLoader.php create mode 100644 tests/Routing/DeprecatedEasyAdminRouteAliasLoaderTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index a192521..7ca43b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Latest ------ ## Changes -* [#172](https://github.com/cleverage/ui-process-bundle/issues/172) Prefix the route names of the bundle with `cleverage_ui_process_`, as required by the Symfony best practices for bundles: `cleverage_ui_process_login`, `cleverage_ui_process_logout`, `cleverage_ui_process_list`, `cleverage_ui_process_launch`, `cleverage_ui_process_http_execute`. The former names (`process_login`, `process_logout`, `process_list`, `process_launch`, `http_process_execute`) are deprecated route aliases (new `config/routes/deprecated_aliases.yaml`, loaded by the documented import), removed in 4.0; `?routeName=` URLs keep working. The dashboard route (`process`) and the EasyAdmin routes generated from it will be renamed in 4.0. Document that `easyadmin.routes` generates the routes of every dashboard. Update documentation and UPGRADE.md, add tests. +* [#172](https://github.com/cleverage/ui-process-bundle/issues/172) Prefix the route names of the bundle with `cleverage_ui_process_`, as required by the Symfony best practices for bundles: `cleverage_ui_process_login`, `cleverage_ui_process_logout`, `cleverage_ui_process_list`, `cleverage_ui_process_launch`, `cleverage_ui_process_http_execute`, and the dashboard `cleverage_ui_process`, so that the routes generated by EasyAdmin for the CRUD pages are `cleverage_ui_process__`. The former names (`process`, `process__`, `process_login`, `process_logout`, `process_list`, `process_launch`, `http_process_execute`) are deprecated route aliases (new `config/routes/deprecated_aliases.yaml`, loaded by the documented import, and internal `DeprecatedEasyAdminRouteAliasLoader` for the routes generated by EasyAdmin), removed in 4.0; `?routeName=` URLs keep working. Document that `easyadmin.routes` generates the routes of every dashboard. Update documentation and UPGRADE.md, add tests. * [#166](https://github.com/cleverage/ui-process-bundle/issues/166) Doctrine ORM 2: the entities have readonly properties (since v3.2), which the legacy proxies of ORM 2 cannot handle (`Cannot unset readonly property ... from scope Proxies\__CG__\...` when an entity proxy is loaded). The container compilation now fails with an explicit message when ORM 2 is used without `doctrine.orm.enable_lazy_ghost_objects: true` (new internal `CheckDoctrineLazyGhostObjectsPass`); nothing changes with ORM 3. Update documentation, add tests. * [#164](https://github.com/cleverage/ui-process-bundle/issues/164) Require `symfony/polyfill-php83`, `symfony/polyfill-php84` and `symfony/polyfill-php85`: the functions of PHP 8.3 to 8.5 (`json_validate()`, `array_find()`, `array_first()`...) can be used while supporting PHP 8.2 (see `CONTRIBUTING.md`). Rector is configured for PHP 8.2 (was 8.5, which allowed it to introduce PHP 8.3+ functions without polyfill) with the `PHP_POLYFILLS` set (`withPhpSets()` without argument), it does not change the code. `array_last()` replaces `end()` in a test. Tests: lazy ghost proxies with Doctrine ORM 2 (now installed by the lowest dependencies job), as configured by the Symfony recipe: the legacy proxies cannot unset the readonly properties of the entities. * [#158](https://github.com/cleverage/ui-process-bundle/issues/158) CI: test the lowest versions allowed by `composer.json` (`--prefer-lowest`, PHP 8.2). Require `symfony/scheduler` ^6.4.44 || ^7.4.17 || ^8.1.5: the `every` expressions validation (`EveryExpressionValidator`) relies on the `PeriodicalTrigger` rejecting the intervals that do not move the run date forward or resolve to zero seconds (older versions loop forever on e.g. "yesterday", and fail with a `TypeError` on an invalid expression). `ProcessExecutionDurationFilter`: the number of seconds is cast to an integer and inlined in the DQL instead of being bound as a parameter (#111): with DBAL 3, the SQLite platform puts the `SECOND` intervals inside a string literal, so the parameter was never bound ("column index out of range" error on SQLite with DBAL 3). diff --git a/UPGRADE.md b/UPGRADE.md index ca051e0..20aa9d5 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -9,16 +9,18 @@ The routes of the bundle are prefixed with `cleverage_ui_process_`. The former n 4.0: update the references in your application (`path()` / `url()`, `redirectToRoute()`, security configuration when `security.configure_firewall` is `false`...). -| Before (deprecated) | After | -|------------------------|-------------------------------------| -| `process_login` | `cleverage_ui_process_login` | -| `process_logout` | `cleverage_ui_process_logout` | -| `process_list` | `cleverage_ui_process_list` | -| `process_launch` | `cleverage_ui_process_launch` | -| `http_process_execute` | `cleverage_ui_process_http_execute` | - -The dashboard route (`process`) and the EasyAdmin routes generated from it (`process__`) are unchanged, -they will be renamed in 4.0. +| Before (deprecated) | After | +|---------------------------|----------------------------------------| +| `process` | `cleverage_ui_process` (dashboard) | +| `process__` | `cleverage_ui_process__` | +| `process_login` | `cleverage_ui_process_login` | +| `process_logout` | `cleverage_ui_process_logout` | +| `process_list` | `cleverage_ui_process_list` | +| `process_launch` | `cleverage_ui_process_launch` | +| `http_process_execute` | `cleverage_ui_process_http_execute` | + +The routes of the CRUD pages are generated by EasyAdmin from the dashboard route name, e.g. +`process_process_execution_index` is now `cleverage_ui_process_process_execution_index`. ## v3.0 diff --git a/config/routes/deprecated_aliases.yaml b/config/routes/deprecated_aliases.yaml index f464ab0..cf7b0e9 100644 --- a/config/routes/deprecated_aliases.yaml +++ b/config/routes/deprecated_aliases.yaml @@ -1,5 +1,4 @@ -# Former names of the routes of the bundle, deprecated since 3.3: use the cleverage_ui_process_* names -# The dashboard route ("process") and the EasyAdmin routes generated from it ("process_*") will be renamed in 4.0 +# Former names of the routes of the bundle, deprecated since 3.3 (removed in 4.0): use the cleverage_ui_process_* names process_login: alias: cleverage_ui_process_login @@ -35,3 +34,8 @@ http_process_execute: package: 'cleverage/ui-process-bundle' version: '3.3' message: 'The "%alias_id%" route alias is deprecated, use the "cleverage_ui_process_http_execute" route instead. It will be removed in 4.0.' + +# Dashboard ("process") and routes generated by EasyAdmin from it ("process__") +cleverage_ui_process_deprecated_easyadmin_route_aliases: + resource: . + type: cleverage_ui_process.deprecated_easyadmin_route_aliases diff --git a/config/services/routing.yaml b/config/services/routing.yaml new file mode 100644 index 0000000..1e9233d --- /dev/null +++ b/config/services/routing.yaml @@ -0,0 +1,6 @@ +services: + cleverage_ui_process.routing.deprecated_easyadmin_route_alias_loader: + class: CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader + public: false + tags: + - { name: routing.loader } diff --git a/docs/reference/03-users_and_security.md b/docs/reference/03-users_and_security.md index 63c8c0b..c05f257 100644 --- a/docs/reference/03-users_and_security.md +++ b/docs/reference/03-users_and_security.md @@ -134,17 +134,20 @@ Routes are imported with `@CleverAgeUiProcessBundle/config/routes/*.yaml` (see [ | Route name | Former name (deprecated) | Path | Description | |-------------------------------------|--------------------------|----------------------------------|----------------------------------------------------------------------------------------------| -| `process` | | `/process` | EasyAdmin dashboard, redirects to the executions list. CRUD pages are sub-routes of it. | +| `cleverage_ui_process` | `process` | `/process` | EasyAdmin dashboard, redirects to the executions list. CRUD pages are sub-routes of it. | | `cleverage_ui_process_login` | `process_login` | `/process/login` | Login form. | | `cleverage_ui_process_logout` | `process_logout` | `/process/logout` | Logout. | | `cleverage_ui_process_list` | `process_list` | `/process/list` | List of public processes. | | `cleverage_ui_process_launch` | `process_launch` | `/process/launch?process=` | Launch a process (confirmation, form or direct, see [launch modes](02-process_ui_options.md#launch-modes)). | | `cleverage_ui_process_http_execute` | `http_process_execute` | `/http/process/execute` (POST) | [HTTP API](06-http_api.md). | +The routes of the CRUD pages are generated by EasyAdmin from the dashboard route name: +`cleverage_ui_process__` (e.g. `cleverage_ui_process_process_execution_index`), formerly +`process__`. + The former route names are deprecated aliases since 3.3 (`config/routes/deprecated_aliases.yaml`), removed in 4.0: generating a URL with them, or opening a `?routeName=` URL of the dashboard, still works and triggers a -deprecation. The dashboard route (`process`) and the EasyAdmin routes generated from it (`process__`) -will be renamed in 4.0. +deprecation. The EasyAdmin routes (the dashboard and its CRUD pages) are generated by the `easyadmin.routes` loader imported by `config/routes/easyadmin.yaml`. This loader generates the routes of **every** dashboard, including the ones of your diff --git a/src/Controller/Admin/Process/LaunchAction.php b/src/Controller/Admin/Process/LaunchAction.php index 19d8e13..e4a5f39 100644 --- a/src/Controller/Admin/Process/LaunchAction.php +++ b/src/Controller/Admin/Process/LaunchAction.php @@ -54,7 +54,7 @@ public function __invoke( ): Response { // Accessed directly, not through the dashboard: the template needs the EasyAdmin context if (!$this->adminContextProvider->getContext() instanceof AdminContextInterface) { - return $this->redirectToRoute('process', ['routeName' => 'cleverage_ui_process_launch'] + ($this->requestStack->getMainRequest()?->query->all() ?? [])); + return $this->redirectToRoute('cleverage_ui_process', ['routeName' => 'cleverage_ui_process_launch'] + ($this->requestStack->getMainRequest()?->query->all() ?? [])); } $processCode = (string) $this->requestStack->getMainRequest()?->query->get('process'); if ('' === $processCode) { @@ -71,7 +71,7 @@ public function __invoke( 'Process has been added to queue. It will start as soon as possible' ); - return $this->redirectToRoute('process', ['routeName' => 'cleverage_ui_process_list']); + return $this->redirectToRoute('cleverage_ui_process', ['routeName' => 'cleverage_ui_process_list']); } $form = $this->createForm( LaunchType::class, @@ -108,7 +108,7 @@ public function __invoke( 'Process has been added to queue. It will start as soon as possible' ); - return $this->redirectToRoute('process', ['routeName' => 'cleverage_ui_process_list']); + return $this->redirectToRoute('cleverage_ui_process', ['routeName' => 'cleverage_ui_process_list']); } $this->adminContextProvider->getContext()->getAssets()->addJsAsset(Asset::fromEasyAdminAssetPackage('field-collection.js')->getAsDto()); diff --git a/src/Controller/Admin/Process/ListAction.php b/src/Controller/Admin/Process/ListAction.php index bd597cf..f44ad32 100644 --- a/src/Controller/Admin/Process/ListAction.php +++ b/src/Controller/Admin/Process/ListAction.php @@ -37,7 +37,7 @@ public function __invoke(): Response { // Accessed directly, not through the dashboard: the template needs the EasyAdmin context if (!$this->adminContextProvider->getContext() instanceof AdminContextInterface) { - return $this->redirectToRoute('process', ['routeName' => 'cleverage_ui_process_list']); + return $this->redirectToRoute('cleverage_ui_process', ['routeName' => 'cleverage_ui_process_list']); } return $this->render( diff --git a/src/Controller/Admin/ProcessDashboardController.php b/src/Controller/Admin/ProcessDashboardController.php index 24922dd..30665af 100644 --- a/src/Controller/Admin/ProcessDashboardController.php +++ b/src/Controller/Admin/ProcessDashboardController.php @@ -26,7 +26,7 @@ use Symfony\Component\Translation\LocaleSwitcher; #[IsGranted('ROLE_USER')] -#[AdminDashboard(routePath: '/process', routeName: 'process')] +#[AdminDashboard(routePath: '/process', routeName: 'cleverage_ui_process')] class ProcessDashboardController extends AbstractDashboardController { public function __construct( diff --git a/src/Controller/Admin/Security/LoginController.php b/src/Controller/Admin/Security/LoginController.php index 170fd33..6108d8c 100644 --- a/src/Controller/Admin/Security/LoginController.php +++ b/src/Controller/Admin/Security/LoginController.php @@ -27,7 +27,7 @@ public function __invoke(AuthenticationUtils $authenticationUtils): Response '@CleverAgeUiProcess/admin/login.html.twig', [ 'page_title' => 'Login', - 'target_path' => $this->generateUrl('process'), + 'target_path' => $this->generateUrl('cleverage_ui_process'), 'error' => $authenticationUtils->getLastAuthenticationError(), 'last_username' => $authenticationUtils->getLastUsername(), ] diff --git a/src/Routing/DeprecatedEasyAdminRouteAliasLoader.php b/src/Routing/DeprecatedEasyAdminRouteAliasLoader.php new file mode 100644 index 0000000..ffc597e --- /dev/null +++ b/src/Routing/DeprecatedEasyAdminRouteAliasLoader.php @@ -0,0 +1,63 @@ +_" before 3.3, "cleverage_ui_process" and "cleverage_ui_process__" since. + * They are deprecated aliases, removed in 4.0. + * + * Loads the routes generated by EasyAdmin (easyadmin.routes) only to know their names: returns the aliases only. + * + * @internal + */ +final class DeprecatedEasyAdminRouteAliasLoader extends Loader +{ + public const TYPE = 'cleverage_ui_process.deprecated_easyadmin_route_aliases'; + + private const ROUTE_NAME = 'cleverage_ui_process'; + + private const FORMER_ROUTE_NAME = 'process'; + + public function load(mixed $resource, ?string $type = null): RouteCollection + { + /** @var RouteCollection $easyAdminRoutes */ + $easyAdminRoutes = $this->import('.', 'easyadmin.routes'); + $aliases = new RouteCollection(); + foreach ($easyAdminRoutes->all() as $name => $route) { + if (ProcessDashboardController::class !== $route->getDefault(EA::DASHBOARD_CONTROLLER_FQCN) + || (self::ROUTE_NAME !== $name && !str_starts_with($name, self::ROUTE_NAME.'_'))) { + continue; + } + $formerName = self::FORMER_ROUTE_NAME.substr($name, \strlen(self::ROUTE_NAME)); + $aliases->addAlias($formerName, $name)->setDeprecated( + 'cleverage/ui-process-bundle', + '3.3', + \sprintf('The "%%alias_id%%" route alias is deprecated, use the "%s" route instead. It will be removed in 4.0.', $name), + ); + } + + return $aliases; + } + + public function supports(mixed $resource, ?string $type = null): bool + { + return self::TYPE === $type; + } +} diff --git a/templates/admin/process/list.html.twig b/templates/admin/process/list.html.twig index 6e58314..fa72cbb 100644 --- a/templates/admin/process/list.html.twig +++ b/templates/admin/process/list.html.twig @@ -40,7 +40,7 @@ {% else %} - + {% endif %} @@ -50,7 +50,7 @@ data-placement="top" title="{{ 'View executions'|trans }}" href="{{ url( - 'process', + 'cleverage_ui_process', { crudAction: 'index', crudControllerFqcn: 'CleverAge\\UiProcessBundle\\Controller\\Admin\\ProcessExecutionCrudController', @@ -71,7 +71,7 @@ id="{{ process.code }}" title="{{ 'Run process'|trans }} {{ process.code }}" message="{{ 'Do you really want to run process %process% in background'|trans({'%process%': process.code}) }} ?" - confirmUrl="{{ url('process', {routeName: 'cleverage_ui_process_launch', process: process.code}) }}" + confirmUrl="{{ url('cleverage_ui_process', {routeName: 'cleverage_ui_process_launch', process: process.code}) }}" /> {% endfor %} {% endblock %} diff --git a/tests/CleverAgeUiProcessBundleTest.php b/tests/CleverAgeUiProcessBundleTest.php index 1def66f..b900fa2 100644 --- a/tests/CleverAgeUiProcessBundleTest.php +++ b/tests/CleverAgeUiProcessBundleTest.php @@ -16,6 +16,7 @@ use CleverAge\UiProcessBundle\CleverAgeUiProcessBundle; use CleverAge\UiProcessBundle\DependencyInjection\CleverAgeUiProcessExtension; use CleverAge\UiProcessBundle\DependencyInjection\Compiler\CheckDoctrineLazyGhostObjectsPass; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\UsesClass; use PHPUnit\Framework\TestCase; @@ -23,6 +24,7 @@ #[CoversClass(CleverAgeUiProcessBundle::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(CheckDoctrineLazyGhostObjectsPass::class)] class CleverAgeUiProcessBundleTest extends TestCase { diff --git a/tests/Functional/HttpProcessExecuteTest.php b/tests/Functional/HttpProcessExecuteTest.php index f6265d7..a291bfd 100644 --- a/tests/Functional/HttpProcessExecuteTest.php +++ b/tests/Functional/HttpProcessExecuteTest.php @@ -37,6 +37,7 @@ use CleverAge\UiProcessBundle\Notifier\NotificationTrigger; use CleverAge\UiProcessBundle\Notifier\ProcessExecutionNotifier; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Security\HttpProcessExecutionAuthenticator; use CleverAge\UiProcessBundle\StopChecker\ProcessExecutionStopChecker; use CleverAge\UiProcessBundle\Twig\Extension\LogLevelExtension; @@ -62,6 +63,7 @@ #[UsesClass(ProcessScheduleCrudController::class)] #[UsesClass(UserCrudController::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessExecution::class)] #[UsesClass(User::class)] diff --git a/tests/Functional/LaunchActionTest.php b/tests/Functional/LaunchActionTest.php index 1834828..95d2a9a 100644 --- a/tests/Functional/LaunchActionTest.php +++ b/tests/Functional/LaunchActionTest.php @@ -33,6 +33,7 @@ use CleverAge\UiProcessBundle\Monolog\Handler\DoctrineProcessHandler; use CleverAge\UiProcessBundle\Monolog\Handler\ProcessHandler; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Security\HttpProcessExecutionAuthenticator; use CleverAge\UiProcessBundle\Twig\Extension\LogLevelExtension; use CleverAge\UiProcessBundle\Twig\Extension\MD5Extension; @@ -67,6 +68,7 @@ #[UsesClass(ProcessScheduleCrudController::class)] #[UsesClass(UserCrudController::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(DoctrineProcessHandler::class)] diff --git a/tests/Functional/LogRecordCrudTest.php b/tests/Functional/LogRecordCrudTest.php index 7a84093..3bd0b29 100644 --- a/tests/Functional/LogRecordCrudTest.php +++ b/tests/Functional/LogRecordCrudTest.php @@ -33,6 +33,7 @@ use CleverAge\UiProcessBundle\Monolog\Handler\DoctrineProcessHandler; use CleverAge\UiProcessBundle\Monolog\Handler\ProcessHandler; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Security\HttpProcessExecutionAuthenticator; use CleverAge\UiProcessBundle\Twig\Extension\LogLevelExtension; use CleverAge\UiProcessBundle\Twig\Extension\MD5Extension; @@ -64,6 +65,7 @@ #[UsesClass(ProcessScheduleCrudController::class)] #[UsesClass(UserCrudController::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(ProcessExecutionRepository::class)] diff --git a/tests/Functional/ProcessExecutionCrudTest.php b/tests/Functional/ProcessExecutionCrudTest.php index 2caa679..8b89705 100644 --- a/tests/Functional/ProcessExecutionCrudTest.php +++ b/tests/Functional/ProcessExecutionCrudTest.php @@ -34,6 +34,7 @@ use CleverAge\UiProcessBundle\Monolog\Handler\DoctrineProcessHandler; use CleverAge\UiProcessBundle\Monolog\Handler\ProcessHandler; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Security\HttpProcessExecutionAuthenticator; use CleverAge\UiProcessBundle\Twig\Extension\LogLevelExtension; use CleverAge\UiProcessBundle\Twig\Extension\MD5Extension; @@ -70,6 +71,7 @@ #[UsesClass(ProcessScheduleCrudController::class)] #[UsesClass(UserCrudController::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(DoctrineProcessHandler::class)] diff --git a/tests/Functional/ProcessExecutionNotificationTest.php b/tests/Functional/ProcessExecutionNotificationTest.php index fdbe070..a1fc04c 100644 --- a/tests/Functional/ProcessExecutionNotificationTest.php +++ b/tests/Functional/ProcessExecutionNotificationTest.php @@ -29,6 +29,7 @@ use CleverAge\UiProcessBundle\Notifier\ProcessExecutionNotification; use CleverAge\UiProcessBundle\Notifier\ProcessExecutionNotifier; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\StopChecker\ProcessExecutionStopChecker; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\UsesClass; @@ -41,6 +42,7 @@ #[UsesClass(CleverAgeUiProcessBundle::class)] #[UsesClass(CheckDoctrineLazyGhostObjectsPass::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessExecution::class)] #[UsesClass(ProcessEventSubscriber::class)] diff --git a/tests/Functional/ProcessListTest.php b/tests/Functional/ProcessListTest.php index d0d425a..04bacbe 100644 --- a/tests/Functional/ProcessListTest.php +++ b/tests/Functional/ProcessListTest.php @@ -29,6 +29,7 @@ use CleverAge\UiProcessBundle\Monolog\Handler\DoctrineProcessHandler; use CleverAge\UiProcessBundle\Monolog\Handler\ProcessHandler; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Security\HttpProcessExecutionAuthenticator; use CleverAge\UiProcessBundle\Twig\Extension\LogLevelExtension; use CleverAge\UiProcessBundle\Twig\Extension\MD5Extension; @@ -60,6 +61,7 @@ #[UsesClass(ProcessScheduleCrudController::class)] #[UsesClass(UserCrudController::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] class ProcessListTest extends FunctionalTestCase diff --git a/tests/Functional/ProcessScheduleCrudTest.php b/tests/Functional/ProcessScheduleCrudTest.php index a820a89..f723f44 100644 --- a/tests/Functional/ProcessScheduleCrudTest.php +++ b/tests/Functional/ProcessScheduleCrudTest.php @@ -33,6 +33,7 @@ use CleverAge\UiProcessBundle\Monolog\Handler\ProcessHandler; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; use CleverAge\UiProcessBundle\Repository\ProcessScheduleRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Security\HttpProcessExecutionAuthenticator; use CleverAge\UiProcessBundle\Twig\Extension\LogLevelExtension; use CleverAge\UiProcessBundle\Twig\Extension\MD5Extension; @@ -67,6 +68,7 @@ #[UsesClass(ProcessExecutionCrudController::class)] #[UsesClass(UserCrudController::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(ProcessExecutionRepository::class)] diff --git a/tests/Functional/PurgeLogsCommandTest.php b/tests/Functional/PurgeLogsCommandTest.php index a7790be..ee526b9 100644 --- a/tests/Functional/PurgeLogsCommandTest.php +++ b/tests/Functional/PurgeLogsCommandTest.php @@ -24,6 +24,7 @@ use CleverAge\UiProcessBundle\Entity\User; use CleverAge\UiProcessBundle\Manager\ProcessConfigurationsManager; use CleverAge\UiProcessBundle\Notifier\NotificationTrigger; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use Monolog\Level; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\UsesClass; @@ -35,6 +36,7 @@ #[UsesClass(CleverAgeUiProcessBundle::class)] #[UsesClass(CheckDoctrineLazyGhostObjectsPass::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(LogRecord::class)] #[UsesClass(ProcessExecution::class)] diff --git a/tests/Functional/RouteNamesTest.php b/tests/Functional/RouteNamesTest.php index 6fdad5e..8ffc607 100644 --- a/tests/Functional/RouteNamesTest.php +++ b/tests/Functional/RouteNamesTest.php @@ -19,17 +19,21 @@ use Symfony\Component\Routing\Router; /** - * The routes of the bundle are prefixed with "cleverage_ui_process_" (config/routes/), their former names are - * deprecated aliases (config/routes/deprecated_aliases.yaml). + * The routes of the bundle are prefixed with "cleverage_ui_process_" (config/routes/, the dashboard route name for the + * routes generated by EasyAdmin), their former names are deprecated aliases (config/routes/deprecated_aliases.yaml). */ #[CoversNothing] class RouteNamesTest extends FunctionalTestCase { /** - * @return iterable + * @return iterable}> */ public static function provideRoutes(): iterable { + yield 'dashboard' => ['cleverage_ui_process', 'process', '/process']; + // Generated by EasyAdmin from the route name of the dashboard + yield 'executions' => ['cleverage_ui_process_process_execution_index', 'process_process_execution_index', '/process/process-execution']; + yield 'user edit' => ['cleverage_ui_process_user_edit', 'process_user_edit', '/process/user/1/edit', 'GET', ['entityId' => 1]]; yield 'login' => ['cleverage_ui_process_login', 'process_login', '/process/login']; yield 'logout' => ['cleverage_ui_process_logout', 'process_logout', '/process/logout']; yield 'process list' => ['cleverage_ui_process_list', 'process_list', '/process/list']; @@ -37,13 +41,16 @@ public static function provideRoutes(): iterable yield 'HTTP API' => ['cleverage_ui_process_http_execute', 'http_process_execute', '/http/process/execute', 'POST']; } + /** + * @param array $parameters + */ #[DataProvider('provideRoutes')] - public function testRoute(string $name, string $formerName, string $path, string $method = 'GET'): void + public function testRoute(string $name, string $formerName, string $path, string $method = 'GET', array $parameters = []): void { $router = static::getContainer()->get('router'); self::assertInstanceOf(Router::class, $router); - self::assertSame($path, $router->generate($name)); + self::assertSame($path, $router->generate($name, $parameters)); self::assertSame($name, $router->matchRequest(Request::create($path, $method))['_route'] ?? null); $deprecations = []; @@ -53,7 +60,7 @@ public function testRoute(string $name, string $formerName, string $path, string return true; }, \E_USER_DEPRECATED); try { - self::assertSame($path, $router->generate($formerName)); + self::assertSame($path, $router->generate($formerName, $parameters)); } finally { restore_error_handler(); } diff --git a/tests/Functional/SecurityTest.php b/tests/Functional/SecurityTest.php index a25c9da..402c5fd 100644 --- a/tests/Functional/SecurityTest.php +++ b/tests/Functional/SecurityTest.php @@ -36,6 +36,7 @@ use CleverAge\UiProcessBundle\Monolog\Handler\DoctrineProcessHandler; use CleverAge\UiProcessBundle\Monolog\Handler\ProcessHandler; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Security\HttpProcessExecutionAuthenticator; use CleverAge\UiProcessBundle\Twig\Extension\LogLevelExtension; use CleverAge\UiProcessBundle\Twig\Extension\MD5Extension; @@ -72,6 +73,7 @@ #[UsesClass(CleverAgeUiProcessBundle::class)] #[UsesClass(CheckDoctrineLazyGhostObjectsPass::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(DoctrineProcessHandler::class)] diff --git a/tests/Functional/UserCrudTest.php b/tests/Functional/UserCrudTest.php index c7461f2..d0738e2 100644 --- a/tests/Functional/UserCrudTest.php +++ b/tests/Functional/UserCrudTest.php @@ -28,6 +28,7 @@ use CleverAge\UiProcessBundle\Monolog\Handler\DoctrineProcessHandler; use CleverAge\UiProcessBundle\Monolog\Handler\ProcessHandler; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Security\HttpProcessExecutionAuthenticator; use CleverAge\UiProcessBundle\Twig\Extension\LogLevelExtension; use CleverAge\UiProcessBundle\Twig\Extension\MD5Extension; @@ -51,6 +52,7 @@ #[UsesClass(ProcessExecutionCrudController::class)] #[UsesClass(ProcessScheduleCrudController::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(ProcessConfigurationsManager::class)] diff --git a/tests/Manager/ProcessExecutionManagerEntityManagerTest.php b/tests/Manager/ProcessExecutionManagerEntityManagerTest.php index 7f1380a..8c4bbb2 100644 --- a/tests/Manager/ProcessExecutionManagerEntityManagerTest.php +++ b/tests/Manager/ProcessExecutionManagerEntityManagerTest.php @@ -24,6 +24,7 @@ use CleverAge\UiProcessBundle\Manager\ProcessExecutionManager; use CleverAge\UiProcessBundle\Monolog\Handler\DoctrineProcessHandler; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Tests\App\TestKernel; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Tools\SchemaTool; @@ -44,6 +45,7 @@ #[UsesClass(CleverAgeUiProcessBundle::class)] #[UsesClass(CheckDoctrineLazyGhostObjectsPass::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(LogRecord::class)] diff --git a/tests/Monolog/Handler/DoctrineProcessHandlerEntityManagerTest.php b/tests/Monolog/Handler/DoctrineProcessHandlerEntityManagerTest.php index a573755..e7b8b55 100644 --- a/tests/Monolog/Handler/DoctrineProcessHandlerEntityManagerTest.php +++ b/tests/Monolog/Handler/DoctrineProcessHandlerEntityManagerTest.php @@ -24,6 +24,7 @@ use CleverAge\UiProcessBundle\Manager\ProcessExecutionManager; use CleverAge\UiProcessBundle\Monolog\Handler\DoctrineProcessHandler; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Tests\App\TestKernel; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Tools\SchemaTool; @@ -39,6 +40,7 @@ #[UsesClass(CleverAgeUiProcessBundle::class)] #[UsesClass(CheckDoctrineLazyGhostObjectsPass::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(LogRecord::class)] diff --git a/tests/Repository/ProcessExecutionRepositoryTest.php b/tests/Repository/ProcessExecutionRepositoryTest.php index 0f23e3f..76152fb 100644 --- a/tests/Repository/ProcessExecutionRepositoryTest.php +++ b/tests/Repository/ProcessExecutionRepositoryTest.php @@ -21,6 +21,7 @@ use CleverAge\UiProcessBundle\Entity\ProcessExecution; use CleverAge\UiProcessBundle\EventSubscriber\ProcessEventSubscriber; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Tests\App\TestKernel; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\EntityManagerInterface; @@ -34,6 +35,7 @@ #[UsesClass(CleverAgeUiProcessBundle::class)] #[UsesClass(CheckDoctrineLazyGhostObjectsPass::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(LogRecord::class)] diff --git a/tests/Repository/ProcessScheduleRepositoryTest.php b/tests/Repository/ProcessScheduleRepositoryTest.php index 62d41f8..0aa1c40 100644 --- a/tests/Repository/ProcessScheduleRepositoryTest.php +++ b/tests/Repository/ProcessScheduleRepositoryTest.php @@ -21,6 +21,7 @@ use CleverAge\UiProcessBundle\Entity\ProcessSchedule; use CleverAge\UiProcessBundle\EventSubscriber\ProcessEventSubscriber; use CleverAge\UiProcessBundle\Repository\ProcessScheduleRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\Tests\App\TestKernel; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Tools\SchemaTool; @@ -32,6 +33,7 @@ #[UsesClass(CleverAgeUiProcessBundle::class)] #[UsesClass(CheckDoctrineLazyGhostObjectsPass::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(ProcessSchedule::class)] diff --git a/tests/Routing/DeprecatedEasyAdminRouteAliasLoaderTest.php b/tests/Routing/DeprecatedEasyAdminRouteAliasLoaderTest.php new file mode 100644 index 0000000..fc70c96 --- /dev/null +++ b/tests/Routing/DeprecatedEasyAdminRouteAliasLoaderTest.php @@ -0,0 +1,87 @@ +add('cleverage_ui_process', $this->createRoute('/process', ProcessDashboardController::class)); + $easyAdminRoutes->add('cleverage_ui_process_process_execution_index', $this->createRoute('/process/process-execution', ProcessDashboardController::class)); + // Routes of another dashboard (of the application) + $easyAdminRoutes->add('admin', $this->createRoute('/admin', 'App\Controller\Admin\DashboardController')); + $easyAdminRoutes->add('cleverage_ui_process_other', $this->createRoute('/admin/other', 'App\Controller\Admin\DashboardController')); + // Not generated from the dashboard route name + $easyAdminRoutes->add('cleverage_ui_processes', $this->createRoute('/processes', ProcessDashboardController::class)); + + $loader = new DeprecatedEasyAdminRouteAliasLoader(); + $loader->setResolver(new LoaderResolver([$this->createEasyAdminLoader($easyAdminRoutes)])); + self::assertTrue($loader->supports('.', DeprecatedEasyAdminRouteAliasLoader::TYPE)); + self::assertFalse($loader->supports('.', 'easyadmin.routes')); + + $aliases = $loader->load('.', DeprecatedEasyAdminRouteAliasLoader::TYPE); + + self::assertSame([], $aliases->all()); + self::assertSame(['process', 'process_process_execution_index'], array_keys($aliases->getAliases())); + $alias = $aliases->getAlias('process_process_execution_index'); + self::assertNotNull($alias); + self::assertSame('cleverage_ui_process_process_execution_index', $alias->getId()); + self::assertSame( + [ + 'package' => 'cleverage/ui-process-bundle', + 'version' => '3.3', + 'message' => 'The "process_process_execution_index" route alias is deprecated, use the "cleverage_ui_process_process_execution_index" route instead. It will be removed in 4.0.', + ], + $alias->getDeprecation('process_process_execution_index') + ); + self::assertSame('cleverage_ui_process', $aliases->getAlias('process')?->getId()); + } + + private function createRoute(string $path, string $dashboardFqcn): Route + { + return new Route($path, [EA::DASHBOARD_CONTROLLER_FQCN => $dashboardFqcn]); + } + + private function createEasyAdminLoader(RouteCollection $routes): Loader + { + return new class($routes) extends Loader { + public function __construct(private readonly RouteCollection $routes) + { + parent::__construct(); + } + + public function load(mixed $resource, ?string $type = null): RouteCollection + { + return $this->routes; + } + + public function supports(mixed $resource, ?string $type = null): bool + { + return 'easyadmin.routes' === $type; + } + }; + } +} diff --git a/tests/StopChecker/ProcessExecutionStopCheckerTest.php b/tests/StopChecker/ProcessExecutionStopCheckerTest.php index bd30a96..5ef6448 100644 --- a/tests/StopChecker/ProcessExecutionStopCheckerTest.php +++ b/tests/StopChecker/ProcessExecutionStopCheckerTest.php @@ -24,6 +24,7 @@ use CleverAge\UiProcessBundle\EventSubscriber\ProcessEventSubscriber; use CleverAge\UiProcessBundle\Manager\ProcessExecutionManager; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; +use CleverAge\UiProcessBundle\Routing\DeprecatedEasyAdminRouteAliasLoader; use CleverAge\UiProcessBundle\StopChecker\ProcessExecutionStopChecker; use CleverAge\UiProcessBundle\Tests\App\TestKernel; use Doctrine\ORM\EntityManagerInterface; @@ -37,6 +38,7 @@ #[UsesClass(CleverAgeUiProcessBundle::class)] #[UsesClass(CheckDoctrineLazyGhostObjectsPass::class)] #[UsesClass(CleverAgeUiProcessExtension::class)] +#[UsesClass(DeprecatedEasyAdminRouteAliasLoader::class)] #[UsesClass(Configuration::class)] #[UsesClass(ProcessEventSubscriber::class)] #[UsesClass(ProcessExecution::class)]