From 29c6c3b59a0388bed4781eced4aa5f42df6fabb5 Mon Sep 17 00:00:00 2001 From: Adrian Rudnik Date: Tue, 22 Apr 2025 19:45:21 +0200 Subject: [PATCH 1/2] [Scheduler] Throw error on duplicate schedule provider service registration on the same scheduler name --- .../AddScheduleMessengerPass.php | 5 +++ .../RegisterProviderTest.php | 34 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/Symfony/Component/Scheduler/Tests/DependencyInjection/RegisterProviderTest.php diff --git a/src/Symfony/Component/Scheduler/DependencyInjection/AddScheduleMessengerPass.php b/src/Symfony/Component/Scheduler/DependencyInjection/AddScheduleMessengerPass.php index 696422e0d28da..64880149244e1 100644 --- a/src/Symfony/Component/Scheduler/DependencyInjection/AddScheduleMessengerPass.php +++ b/src/Symfony/Component/Scheduler/DependencyInjection/AddScheduleMessengerPass.php @@ -46,6 +46,11 @@ public function process(ContainerBuilder $container): void $scheduleProviderIds = []; foreach ($container->findTaggedServiceIds('scheduler.schedule_provider') as $serviceId => $tags) { $name = $tags[0]['name']; + + if (isset($scheduleProviderIds[$name])) { + throw new InvalidArgumentException(\sprintf('Schedule provider service "%s" can not replace already registered service "%s" for schedule "%s". Make sure to register only one provider per schedule name.', $serviceId, $scheduleProviderIds[$name], $name), 1); + } + $scheduleProviderIds[$name] = $serviceId; } diff --git a/src/Symfony/Component/Scheduler/Tests/DependencyInjection/RegisterProviderTest.php b/src/Symfony/Component/Scheduler/Tests/DependencyInjection/RegisterProviderTest.php new file mode 100644 index 0000000000000..8bbfe41f71be4 --- /dev/null +++ b/src/Symfony/Component/Scheduler/Tests/DependencyInjection/RegisterProviderTest.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Scheduler\Tests\DependencyInjection; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use Symfony\Component\Scheduler\DependencyInjection\AddScheduleMessengerPass; +use Symfony\Component\Scheduler\Tests\Fixtures\SomeScheduleProvider; + +class RegisterProviderTest extends TestCase +{ + public function testErrorOnMultipleProvidersForTheSameSchedule() + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionCode(1); + + $container = new ContainerBuilder(); + + $container->register('provider_a', SomeScheduleProvider::class)->addTag('scheduler.schedule_provider', ['name' => 'default']); + $container->register('provider_b', SomeScheduleProvider::class)->addTag('scheduler.schedule_provider', ['name' => 'default']); + + (new AddScheduleMessengerPass())->process($container); + } +} From d7c2acedcaa3b9299be531ba02ac8f4b4823a5a2 Mon Sep 17 00:00:00 2001 From: adrianrudnik Date: Wed, 23 Apr 2025 01:15:37 +0200 Subject: [PATCH 2/2] [Scheduler] Updated the CHANGELOG --- src/Symfony/Component/Scheduler/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Symfony/Component/Scheduler/CHANGELOG.md b/src/Symfony/Component/Scheduler/CHANGELOG.md index 67512476a7a8e..26067e3589104 100644 --- a/src/Symfony/Component/Scheduler/CHANGELOG.md +++ b/src/Symfony/Component/Scheduler/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG --- * Add `TriggerNormalizer` + * Throw exception when multiple schedule provider services are registered under the same scheduler name 7.2 ---