diff --git a/.docker/php/Dockerfile b/.docker/php/Dockerfile index 33dd796..82be215 100644 --- a/.docker/php/Dockerfile +++ b/.docker/php/Dockerfile @@ -1,4 +1,4 @@ -FROM php:8.4-fpm-alpine +FROM php:8.5-fpm-alpine ARG UID ARG GID @@ -13,8 +13,7 @@ RUN apk update && apk add \ bash \ icu-dev \ && docker-php-ext-configure intl \ - && docker-php-ext-install intl opcache \ - && docker-php-ext-enable opcache + && docker-php-ext-install intl RUN ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime \ && sed -i "s/^;date.timezone =.*/date.timezone = Europe\/Paris/" $PHP_INI_DIR/php.ini diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0e07db0..f2b0431 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,13 +23,14 @@ jobs: - '8.2' - '8.3' - '8.4' - dependencies: [highest] + - '8.5' + dependencies: [highest, lowest] allowed-to-fail: [false] symfony-require: [''] variant: [normal] include: - - php-version: '8.1' - dependencies: highest + - php-version: '8.2' + dependencies: lowest allowed-to-fail: false symfony-require: 6.4.* variant: symfony/symfony:"6.4.*" @@ -41,8 +42,8 @@ jobs: - php-version: '8.2' dependencies: highest allowed-to-fail: false - symfony-require: 7.3.* - variant: symfony/symfony:"7.3.*" + symfony-require: 7.4.* + variant: symfony/symfony:"7.4.*" - php-version: '8.3' dependencies: highest allowed-to-fail: false @@ -51,8 +52,8 @@ jobs: - php-version: '8.3' dependencies: highest allowed-to-fail: false - symfony-require: 7.3.* - variant: symfony/symfony:"7.3.*" + symfony-require: 7.4.* + variant: symfony/symfony:"7.4.*" - php-version: '8.4' dependencies: highest allowed-to-fail: false @@ -61,12 +62,31 @@ jobs: - php-version: '8.4' dependencies: highest allowed-to-fail: false - symfony-require: 7.3.* - variant: symfony/symfony:"7.3.*" - + symfony-require: 7.4.* + variant: symfony/symfony:"7.4.*" + - php-version: '8.4' + dependencies: highest + allowed-to-fail: false + symfony-require: 8.* + variant: symfony/symfony:"8.*" + - php-version: '8.5' + dependencies: highest + allowed-to-fail: false + symfony-require: 6.4.* + variant: symfony/symfony:"6.4.*" + - php-version: '8.5' + dependencies: highest + allowed-to-fail: false + symfony-require: 7.4.* + variant: symfony/symfony:"7.4.*" + - php-version: '8.5' + dependencies: highest + allowed-to-fail: false + symfony-require: 8.* + variant: symfony/symfony:"8.*" steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: @@ -87,4 +107,4 @@ jobs: #- name: Send coverage to Codecov # uses: codecov/codecov-action@v4 # with: - # files: build/logs/clover.xml + # files: build/logs/clover.xml \ No newline at end of file diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index ed5c8c5..d097551 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -24,9 +24,8 @@ return (new PhpCsFixer\Config()) ->setRules([ - '@PHP71Migration' => true, - '@PHP82Migration' => true, - '@PHPUnit75Migration:risky' => true, + '@PHP8x2Migration' => true, + '@PHPUnit7x5Migration:risky' => true, '@Symfony' => true, '@Symfony:risky' => true, '@DoctrineAnnotation' => true, diff --git a/composer.json b/composer.json index cb0eff3..630fa34 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ { "name": "Xavier Marchegay", "email": "xmarchegay@clever-age.com", - "role": "Developer" + "role": "Lead Developer" } ], "autoload": { @@ -36,41 +36,41 @@ } }, "require": { - "php": ">=8.1", + "php": ">=8.2", "ext-ctype": "*", "ext-iconv": "*", - "cleverage/process-bundle": "^4.0", - "doctrine/common": "^3.0", - "doctrine/dbal": "^2.9 || ^3.0", - "doctrine/doctrine-bundle": "^2.5", - "doctrine/doctrine-migrations-bundle": "^3.2", - "doctrine/orm": "^2.9 || ^3.0", - "dragonmantank/cron-expression": "^3.4", - "easycorp/easyadmin-bundle": "^4.8", - "symfony/doctrine-messenger": "^6.4|^7.3", - "symfony/dotenv": "^6.4|^7.3", - "symfony/messenger": "^6.4|^7.3", - "symfony/runtime": "^6.4|^7.3", - "symfony/scheduler": "^6.4|^7.3", - "symfony/string": "^6.4|^7.3", - "symfony/uid": "^6.4|^7.3" + "cleverage/process-bundle": "^5.0", + "doctrine/common": "^3.5", + "doctrine/dbal": "^3.10 || ^4.4", + "doctrine/doctrine-bundle": "^2.18 || ^3.1", + "doctrine/doctrine-migrations-bundle": "^3.7 || ^4", + "doctrine/orm": "^2.20 || ^3.5", + "dragonmantank/cron-expression": "^3.6", + "easycorp/easyadmin-bundle": "^4.27", + "symfony/doctrine-messenger": "^6.4 || ^7.4 || ^8", + "symfony/dotenv": "^6.4 || ^7.4 || ^8", + "symfony/messenger":"^6.4 || ^7.4 || ^8", + "symfony/runtime": "^6.4 || ^7.4 || ^8", + "symfony/scheduler": "^6.4 || ^7.4 || ^8", + "symfony/string":"^6.4 || ^7.4 || ^8", + "symfony/uid": "^6.4 || ^7.4 || ^8" }, "require-dev": { - "doctrine/doctrine-fixtures-bundle": "^3.4", + "doctrine/doctrine-fixtures-bundle": "^3 || ^4", "friendsofphp/php-cs-fixer": "*", "phpstan/extension-installer": "*", "phpstan/phpstan": "*", "phpstan/phpstan-doctrine": "*", "phpstan/phpstan-symfony": "*", - "phpunit/phpunit": "<10.0", + "phpunit/phpunit": "*", "rector/rector": "*", "roave/security-advisories": "dev-latest", - "symfony/browser-kit": "^6.4|^7.3", - "symfony/css-selector": "^6.4|^7.3", - "symfony/debug-bundle": "^6.4|^7.3", + "symfony/browser-kit": "^6.4 || ^7.4 || ^8", + "symfony/css-selector": "^6.4 || ^7.4 || ^8", + "symfony/debug-bundle": "^6.4 || ^7.4 || ^8", "symfony/maker-bundle": "^1.31", - "symfony/web-profiler-bundle": "^6.4|^7.3", - "vincentlanglet/twig-cs-fixer": "^3.3" + "symfony/web-profiler-bundle": "^6.4 || ^7.4 || ^8", + "vincentlanglet/twig-cs-fixer": "^3.11" }, "conflict": { "symfony/twig-bridge": "7.2.0", diff --git a/config/routes/easyadmin.yaml b/config/routes/easyadmin.yaml new file mode 100644 index 0000000..a88552e --- /dev/null +++ b/config/routes/easyadmin.yaml @@ -0,0 +1,3 @@ +easyadmin: + resource: . + type: easyadmin.routes \ No newline at end of file diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 766495c..c3e7947 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,27 +1,22 @@ + failOnWarning="true"> tests - - + src - - + + \ No newline at end of file diff --git a/rector.php b/rector.php index 9f9d327..46168ac 100644 --- a/rector.php +++ b/rector.php @@ -8,18 +8,18 @@ use Rector\ValueObject\PhpVersion; return RectorConfig::configure() - ->withPhpVersion(PhpVersion::PHP_84) + ->withPhpVersion(PhpVersion::PHP_85) ->withPaths([ __DIR__.'/src', __DIR__.'/tests', ]) - ->withPhpSets(php81: true) + ->withPhpSets(php82: true) // here we can define, what prepared sets of rules will be applied ->withComposerBased(doctrine: true) ->withPreparedSets(deadCode: true, codeQuality: true, doctrineCodeQuality: true, symfonyCodeQuality: true) ->withAttributesSets(symfony: true, doctrine: true) ->withSets([ - LevelSetList::UP_TO_PHP_81, + LevelSetList::UP_TO_PHP_82, SymfonySetList::SYMFONY_64, SymfonySetList::SYMFONY_CODE_QUALITY, SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION, diff --git a/src/Controller/Admin/Process/LaunchAction.php b/src/Controller/Admin/Process/LaunchAction.php index 8f6bed5..fffc32c 100644 --- a/src/Controller/Admin/Process/LaunchAction.php +++ b/src/Controller/Admin/Process/LaunchAction.php @@ -40,21 +40,18 @@ #[IsGranted('ROLE_USER')] class LaunchAction extends AbstractController { - public function __construct(private readonly MessageBusInterface $messageBus) + public function __construct(private readonly MessageBusInterface $messageBus, private readonly RequestStack $requestStack, private readonly ProcessConfigurationsManager $processConfigurationsManager, private readonly AdminContext $context) { } public function __invoke( - RequestStack $requestStack, string $uploadDirectory, - ProcessConfigurationsManager $processConfigurationsManager, - AdminContext $context, ): Response { - $processCode = $requestStack->getMainRequest()?->get('process'); - if (null === $processCode) { + $processCode = (string) $this->requestStack->getMainRequest()?->request->get('process'); + if ('' === $processCode) { throw new MissingProcessException(); } - $uiOptions = $processConfigurationsManager->getUiOptions($processCode); + $uiOptions = $this->processConfigurationsManager->getUiOptions($processCode); if (null === $uiOptions) { throw new \InvalidArgumentException('Missing UI Options'); } @@ -84,7 +81,7 @@ public function __invoke( } $form->setData($default); } - $form->handleRequest($requestStack->getMainRequest()); + $form->handleRequest($this->requestStack->getMainRequest()); if ($form->isSubmitted() && $form->isValid()) { $input = $form->get('input')->getData(); if ($input instanceof UploadedFile) { @@ -104,7 +101,7 @@ public function __invoke( return $this->redirectToRoute('process', ['routeName' => 'process_list']); } - $context->getAssets()->addJsAsset(Asset::fromEasyAdminAssetPackage('field-collection.js')->getAsDto()); + $this->context->getAssets()->addJsAsset(Asset::fromEasyAdminAssetPackage('field-collection.js')->getAsDto()); return $this->render( '@CleverAgeUiProcess/admin/process/launch.html.twig', diff --git a/src/Controller/Admin/Process/ListAction.php b/src/Controller/Admin/Process/ListAction.php index 4857c75..7caa193 100644 --- a/src/Controller/Admin/Process/ListAction.php +++ b/src/Controller/Admin/Process/ListAction.php @@ -24,16 +24,16 @@ #[IsGranted('ROLE_USER')] class ListAction extends AbstractController { - public function __construct(private readonly IntlFormatterInterface $intlFormatter) + public function __construct(private readonly IntlFormatterInterface $intlFormatter, private readonly ProcessConfigurationsManager $processConfigurationsManager) { } - public function __invoke(ProcessConfigurationsManager $processConfigurationsManager): Response + public function __invoke(): Response { return $this->render( '@CleverAgeUiProcess/admin/process/list.html.twig', [ - 'processes' => $processConfigurationsManager->getPublicProcesses(), + 'processes' => $this->processConfigurationsManager->getPublicProcesses(), 'IntlFormatterService' => $this->intlFormatter, ] ); diff --git a/src/Controller/Admin/Process/UploadAndExecuteAction.php b/src/Controller/Admin/Process/UploadAndExecuteAction.php index 8392263..8f0691f 100644 --- a/src/Controller/Admin/Process/UploadAndExecuteAction.php +++ b/src/Controller/Admin/Process/UploadAndExecuteAction.php @@ -37,9 +37,11 @@ #[IsGranted('ROLE_USER')] class UploadAndExecuteAction extends AbstractController { + public function __construct(private readonly RequestStack $requestStack, private readonly MessageBusInterface $messageBus) + { + } + public function __invoke( - RequestStack $requestStack, - MessageBusInterface $messageBus, string $uploadDirectory, #[ValueResolver('process')] ProcessConfiguration $processConfiguration, ): Response { @@ -49,15 +51,15 @@ public function __invoke( $form = $this->createForm( ProcessUploadFileType::class, null, - ['process_code' => $requestStack->getMainRequest()?->get('process')] + ['process_code' => $this->requestStack->getMainRequest()?->request->get('process')] ); - $form->handleRequest($requestStack->getMainRequest()); + $form->handleRequest($this->requestStack->getMainRequest()); if ($form->isSubmitted() && $form->isValid()) { /** @var UploadedFile $file */ $file = $form->getData(); $savedFilepath = \sprintf('%s/%s.%s', $uploadDirectory, Uuid::v4(), $file->getClientOriginalExtension()); (new Filesystem())->dumpFile($savedFilepath, $file->getContent()); - $messageBus->dispatch( + $this->messageBus->dispatch( new ProcessExecuteMessage( $form->getConfig()->getOption('process_code'), $savedFilepath diff --git a/src/Controller/Admin/ProcessExecutionCrudController.php b/src/Controller/Admin/ProcessExecutionCrudController.php index 1fa21b2..22e482d 100644 --- a/src/Controller/Admin/ProcessExecutionCrudController.php +++ b/src/Controller/Admin/ProcessExecutionCrudController.php @@ -46,6 +46,7 @@ public function __construct( private readonly ProcessExecutionRepository $processExecutionRepository, private readonly string $logDirectory, private readonly TranslatorInterface $translator, + private readonly AdminContext $context, ) { } @@ -109,7 +110,7 @@ public function configureActions(Actions $actions): Actions ); } - public function showLogs(AdminContext $adminContext): RedirectResponse + public function showLogs(): RedirectResponse { /** @var AdminUrlGenerator $adminUrlGenerator */ $adminUrlGenerator = $this->container->get(AdminUrlGenerator::class); @@ -133,11 +134,10 @@ public function showLogs(AdminContext $adminContext): RedirectResponse return $this->redirect($url); } - public function downloadLogFile( - AdminContext $context, - ): Response { + public function downloadLogFile(): Response + { /** @var ProcessExecution $processExecution */ - $processExecution = $context->getEntity()->getInstance(); + $processExecution = $this->context->getEntity()->getInstance(); $filepath = $this->getLogFilePath($processExecution); $basename = basename($filepath); $content = file_get_contents($filepath); diff --git a/src/Controller/Admin/Security/LogoutController.php b/src/Controller/Admin/Security/LogoutController.php index 9ddd963..ecfd5ce 100644 --- a/src/Controller/Admin/Security/LogoutController.php +++ b/src/Controller/Admin/Security/LogoutController.php @@ -20,10 +20,14 @@ class LogoutController extends AbstractController { + public function __construct(private readonly Security $security) + { + } + #[Route('/process/logout', name: 'process_logout')] - public function __invoke(Security $security): Response + public function __invoke(): Response { - $security->logout(); + $this->security->logout(); return $this->redirectToRoute('process_login'); } diff --git a/src/Controller/Admin/UserCrudController.php b/src/Controller/Admin/UserCrudController.php index 02ccdd3..50b2504 100644 --- a/src/Controller/Admin/UserCrudController.php +++ b/src/Controller/Admin/UserCrudController.php @@ -41,7 +41,7 @@ class UserCrudController extends AbstractCrudController { /** @param array $roles */ - public function __construct(private readonly array $roles) + public function __construct(private readonly array $roles, private readonly AdminContext $adminContext, private readonly AdminUrlGenerator $adminUrlGenerator) { } @@ -103,20 +103,20 @@ public function configureActions(Actions $actions): Actions ->addCssClass(''))->add(Crud::PAGE_EDIT, Action::new('generateToken')->linkToCrudAction('generateToken')); } - public function generateToken(AdminContext $adminContext, AdminUrlGenerator $adminUrlGenerator): Response + public function generateToken(): Response { /** @var User $user */ - $user = $adminContext->getEntity()->getInstance(); + $user = $this->adminContext->getEntity()->getInstance(); $token = md5(uniqid(date('YmdHis'))); $user->setToken((new Pbkdf2PasswordHasher())->hash($token)); $this->persistEntity( - $this->container->get('doctrine')->getManagerForClass($adminContext->getEntity()->getFqcn()), + $this->container->get('doctrine')->getManagerForClass($this->adminContext->getEntity()->getFqcn()), $user ); $this->addFlash('success', 'New token generated '.$token.' (keep it in secured area. This token will never be displayed anymore)'); return $this->redirect( - $adminUrlGenerator + $this->adminUrlGenerator ->setController(self::class) ->setAction(Action::EDIT) ->setEntityId($user->getId()) diff --git a/src/Controller/ProcessExecuteController.php b/src/Controller/ProcessExecuteController.php index dc36f94..b20de45 100644 --- a/src/Controller/ProcessExecuteController.php +++ b/src/Controller/ProcessExecuteController.php @@ -28,13 +28,14 @@ #[Route(path: '/http/process/execute', name: 'http_process_execute', methods: ['POST'])] class ProcessExecuteController extends AbstractController { + public function __construct(private readonly ValidatorInterface $validator, private readonly MessageBusInterface $bus, private readonly ProcessManager $processManager) + { + } + public function __invoke( #[ValueResolver('http_process_execution')] HttpProcessExecution $httpProcessExecution, - ValidatorInterface $validator, - MessageBusInterface $bus, - ProcessManager $processManager, ): JsonResponse { - $violations = $validator->validate($httpProcessExecution); + $violations = $this->validator->validate($httpProcessExecution); if ($violations->count() > 0) { $violationsMessages = []; foreach ($violations as $violation) { @@ -43,7 +44,7 @@ public function __invoke( throw new UnprocessableEntityHttpException(implode('. ', $violationsMessages)); } if ($httpProcessExecution->queue) { - $bus->dispatch( + $this->bus->dispatch( new ProcessExecuteMessage( $httpProcessExecution->code ?? '', $httpProcessExecution->input, @@ -56,7 +57,7 @@ public function __invoke( return new JsonResponse('Process has been added to queue. It will start as soon as possible.'); } else { try { - $processManager->execute( + $this->processManager->execute( $httpProcessExecution->code ?? '', $httpProcessExecution->input, \is_string($httpProcessExecution->context) diff --git a/src/Entity/LogRecord.php b/src/Entity/LogRecord.php index 2a9c25f..808ce1f 100644 --- a/src/Entity/LogRecord.php +++ b/src/Entity/LogRecord.php @@ -51,7 +51,7 @@ public function getId(): ?int public function __construct( \Monolog\LogRecord $record, #[ORM\ManyToOne(targetEntity: ProcessExecution::class, cascade: ['all'])] - #[ORM\JoinColumn(name: 'process_execution_id', referencedColumnName: 'id', onDelete: 'CASCADE', nullable: false)] + #[ORM\JoinColumn(name: 'process_execution_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')] private readonly ProcessExecution $processExecution, ) { $this->channel = (string) (new UnicodeString($record->channel))->truncate(64); diff --git a/src/Entity/ProcessSchedule.php b/src/Entity/ProcessSchedule.php index 2132202..8eea928 100644 --- a/src/Entity/ProcessSchedule.php +++ b/src/Entity/ProcessSchedule.php @@ -87,12 +87,7 @@ public function setContext(array $context): void $this->context = $context; } - /** - * PHP 8.1 Fatal error: Null can not be used as a standalone type. - * - * @phpstan-ignore missingType.return - */ - public function getNextExecution() + public function getNextExecution(): null { return null; } diff --git a/src/EventSubscriber/ProcessEventSubscriber.php b/src/EventSubscriber/ProcessEventSubscriber.php index 66e3f4f..ed90faa 100644 --- a/src/EventSubscriber/ProcessEventSubscriber.php +++ b/src/EventSubscriber/ProcessEventSubscriber.php @@ -22,15 +22,12 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Uid\Uuid; -/** - * PHP 8.2 : Replace by readonly class. - */ -final class ProcessEventSubscriber implements EventSubscriberInterface +final readonly class ProcessEventSubscriber implements EventSubscriberInterface { public function __construct( - private readonly ProcessHandler $processHandler, - private readonly DoctrineProcessHandler $doctrineProcessHandler, - private readonly ProcessExecutionManager $processExecutionManager, + private ProcessHandler $processHandler, + private DoctrineProcessHandler $doctrineProcessHandler, + private ProcessExecutionManager $processExecutionManager, ) { } diff --git a/src/Http/Model/HttpProcessExecution.php b/src/Http/Model/HttpProcessExecution.php index 7ae3e92..3c78a4a 100644 --- a/src/Http/Model/HttpProcessExecution.php +++ b/src/Http/Model/HttpProcessExecution.php @@ -20,21 +20,18 @@ use Symfony\Component\Validator\Constraints\Sequentially; use Symfony\Component\Validator\Constraints\Type; -/** - * PHP 8.2 : Replace by readonly class. - */ -final class HttpProcessExecution +final readonly class HttpProcessExecution { /** * @param string|array $context */ public function __construct( #[Sequentially(constraints: [new NotNull(message: 'Process code is required.'), new IsValidProcessCode()])] - public readonly ?string $code = null, - public readonly ?string $input = null, + public ?string $code = null, + public ?string $input = null, #[AtLeastOneOf(constraints: [new Json(), new Type('array')])] - public readonly string|array $context = [], - public readonly bool $queue = true, + public string|array $context = [], + public bool $queue = true, ) { } } diff --git a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php index d1689b2..fd31642 100644 --- a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php +++ b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php @@ -22,14 +22,13 @@ use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; use Symfony\Component\Serializer\SerializerInterface; -/** - * PHP 8.2 : Replace by readonly class. - */ #[AsTargetedValueResolver('http_process_execution')] -class HttpProcessExecuteValueResolver implements ValueResolverInterface +readonly class HttpProcessExecuteValueResolver implements ValueResolverInterface { - public function __construct(private readonly string $storageDir, private readonly SerializerInterface $serializer) - { + public function __construct( + private string $storageDir, + private SerializerInterface $serializer, + ) { } /** @@ -37,26 +36,46 @@ public function __construct(private readonly string $storageDir, private readonl */ public function resolve(Request $request, ArgumentMetadata $argument): iterable { - $all = $request->request->all(); try { - if ([] === $all) { + $hasRequestData = $request->request->count() > 0 || $request->files->count() > 0; + + if (!$hasRequestData) { + $content = $request->getContent(); + if (empty($content)) { + return [new HttpProcessExecution()]; + } + $httpProcessExecution = $this->serializer->deserialize( - $request->getContent(), + $content, HttpProcessExecution::class, 'json' ); } else { - $input = $request->get('input', $request->files->get('input')); + $input = $request->request->get('input') ?? $request->query->get('input'); + + if (null === $input) { + $input = $request->files->get('input'); + } + if ($input instanceof UploadedFile) { $uploadFileName = $this->storageDir.\DIRECTORY_SEPARATOR.date('YmdHis').'_'.uniqid().'_'.$input->getClientOriginalName(); (new Filesystem())->dumpFile($uploadFileName, $input->getContent()); $input = $uploadFileName; } + + $code = $request->request->get('code') ?? $request->query->get('code'); + $context = $request->request->all('context'); + if ([] === $context) { + $context = $request->query->all('context'); + } + + $queue = $request->request->getBoolean('queue', true); + $httpProcessExecution = new HttpProcessExecution( - $request->get('code'), + (string) $code, $input, - $request->get('context', []), - $request->request->getBoolean('queue', true), + $context, + $queue ); } diff --git a/src/Http/ValueResolver/ProcessConfigurationValueResolver.php b/src/Http/ValueResolver/ProcessConfigurationValueResolver.php index ef06496..9412d3f 100644 --- a/src/Http/ValueResolver/ProcessConfigurationValueResolver.php +++ b/src/Http/ValueResolver/ProcessConfigurationValueResolver.php @@ -20,13 +20,10 @@ use Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; -/** - * PHP 8.2 : Replace by readonly class. - */ #[AsTargetedValueResolver('process')] -class ProcessConfigurationValueResolver implements ValueResolverInterface +readonly class ProcessConfigurationValueResolver implements ValueResolverInterface { - public function __construct(private readonly ProcessConfigurationRegistry $registry) + public function __construct(private ProcessConfigurationRegistry $registry) { } @@ -35,6 +32,6 @@ public function __construct(private readonly ProcessConfigurationRegistry $regis */ public function resolve(Request $request, ArgumentMetadata $argument): iterable { - return [$this->registry->getProcessConfiguration($request->get('process'))]; + return [$this->registry->getProcessConfiguration((string) $request->request->get('process'))]; } } diff --git a/src/Manager/ProcessConfigurationsManager.php b/src/Manager/ProcessConfigurationsManager.php index 00ad111..ff8b8de 100644 --- a/src/Manager/ProcessConfigurationsManager.php +++ b/src/Manager/ProcessConfigurationsManager.php @@ -20,9 +20,6 @@ use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraint; -/** - * PHP 8.2 : Replace by readonly class. - */ /** * @phpstan-type UiOptions array{ * 'source': ?string, @@ -35,9 +32,9 @@ * 'default': array{'input': mixed, 'context': array{array{'key': 'int|text', 'value':'int|text'}}} * } */ -final class ProcessConfigurationsManager +final readonly class ProcessConfigurationsManager { - public function __construct(private readonly ProcessConfigurationRegistry $registry) + public function __construct(private ProcessConfigurationRegistry $registry) { } diff --git a/src/Message/CronProcessMessage.php b/src/Message/CronProcessMessage.php index a8449d7..8e94c09 100644 --- a/src/Message/CronProcessMessage.php +++ b/src/Message/CronProcessMessage.php @@ -15,12 +15,9 @@ use CleverAge\UiProcessBundle\Entity\ProcessSchedule; -/** - * PHP 8.2 : Replace by readonly class. - */ -final class CronProcessMessage +final readonly class CronProcessMessage { - public function __construct(public readonly ProcessSchedule $processSchedule) + public function __construct(public ProcessSchedule $processSchedule) { } } diff --git a/src/Message/CronProcessMessageHandler.php b/src/Message/CronProcessMessageHandler.php index 285742a..a517ece 100644 --- a/src/Message/CronProcessMessageHandler.php +++ b/src/Message/CronProcessMessageHandler.php @@ -16,13 +16,10 @@ use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; -/** - * PHP 8.2 : Replace by readonly class. - */ #[AsMessageHandler] -final class CronProcessMessageHandler +final readonly class CronProcessMessageHandler { - public function __construct(private readonly MessageBusInterface $bus) + public function __construct(private MessageBusInterface $bus) { } diff --git a/src/Message/ProcessExecuteHandler.php b/src/Message/ProcessExecuteHandler.php index 3443541..a76c0e1 100644 --- a/src/Message/ProcessExecuteHandler.php +++ b/src/Message/ProcessExecuteHandler.php @@ -17,13 +17,10 @@ use CleverAge\UiProcessBundle\Monolog\Handler\ProcessHandler; use Symfony\Component\Messenger\Attribute\AsMessageHandler; -/** - * PHP 8.2 : Replace by readonly class. - */ #[AsMessageHandler] -class ProcessExecuteHandler +readonly class ProcessExecuteHandler { - public function __construct(private readonly ProcessManager $manager, private readonly ProcessHandler $processHandler) + public function __construct(private ProcessManager $manager, private ProcessHandler $processHandler) { } diff --git a/src/Message/ProcessExecuteMessage.php b/src/Message/ProcessExecuteMessage.php index 39c45bb..84fddb0 100644 --- a/src/Message/ProcessExecuteMessage.php +++ b/src/Message/ProcessExecuteMessage.php @@ -13,15 +13,12 @@ namespace CleverAge\UiProcessBundle\Message; -/** - * PHP 8.2 : Replace by readonly class. - */ -class ProcessExecuteMessage +readonly class ProcessExecuteMessage { /** * @param mixed[] $context */ - public function __construct(public readonly string $code, public readonly mixed $input, public readonly array $context = []) + public function __construct(public string $code, public mixed $input, public array $context = []) { } } diff --git a/src/Scheduler/CronScheduler.php b/src/Scheduler/CronScheduler.php index 48bc202..b12fd20 100644 --- a/src/Scheduler/CronScheduler.php +++ b/src/Scheduler/CronScheduler.php @@ -22,15 +22,12 @@ use Symfony\Component\Scheduler\ScheduleProviderInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; -/** - * PHP 8.2 : Replace by readonly class. - */ -class CronScheduler implements ScheduleProviderInterface +readonly class CronScheduler implements ScheduleProviderInterface { public function __construct( - private readonly ProcessScheduleRepository $repository, - private readonly ValidatorInterface $validator, - private readonly LoggerInterface $logger, + private ProcessScheduleRepository $repository, + private ValidatorInterface $validator, + private LoggerInterface $logger, ) { } diff --git a/src/Security/HttpProcessExecutionAuthenticator.php b/src/Security/HttpProcessExecutionAuthenticator.php index 85734f9..cfb91c9 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->get('_route') && $request->isMethod(Request::METHOD_POST); + return 'http_process_execute' === $request->request->get('_route') && $request->isMethod(Request::METHOD_POST); } public function authenticate(Request $request): Passport diff --git a/src/Twig/Runtime/ProcessExecutionExtensionRuntime.php b/src/Twig/Runtime/ProcessExecutionExtensionRuntime.php index 90e4967..592f1e4 100644 --- a/src/Twig/Runtime/ProcessExecutionExtensionRuntime.php +++ b/src/Twig/Runtime/ProcessExecutionExtensionRuntime.php @@ -18,14 +18,11 @@ use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; use Twig\Extension\RuntimeExtensionInterface; -/** - * PHP 8.2 : Replace by readonly class. - */ -class ProcessExecutionExtensionRuntime implements RuntimeExtensionInterface +readonly class ProcessExecutionExtensionRuntime implements RuntimeExtensionInterface { public function __construct( - private readonly ProcessExecutionRepository $processExecutionRepository, - private readonly ProcessConfigurationsManager $processConfigurationsManager, + private ProcessExecutionRepository $processExecutionRepository, + private ProcessConfigurationsManager $processConfigurationsManager, ) { } diff --git a/templates/admin/process/launch.html.twig b/templates/admin/process/launch.html.twig index 88d0f7b..7e4e560 100644 --- a/templates/admin/process/launch.html.twig +++ b/templates/admin/process/launch.html.twig @@ -1,5 +1,5 @@ -{% extends ea.templatePath('layout') %} -{% trans_default_domain ea.i18n.translationDomain %} +{% extends ea().templatePath('layout') %} +{% trans_default_domain ea().i18n.translationDomain %} {% block main %} {% form_theme form '@EasyAdmin/crud/form_theme.html.twig' %} diff --git a/templates/admin/process/list.html.twig b/templates/admin/process/list.html.twig index 2a34372..6a1432c 100644 --- a/templates/admin/process/list.html.twig +++ b/templates/admin/process/list.html.twig @@ -1,6 +1,6 @@ {# @var urlGenerator \EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator #} -{% extends ea.templatePath('layout') %} -{% trans_default_domain ea.i18n.translationDomain %} +{% extends ea().templatePath('layout') %} +{% trans_default_domain ea().i18n.translationDomain %} {% block content_title %}{{ 'Processes'|trans }}{% endblock %}