Skip to content

Commit 05714fc

Browse files
authored
Introduce symfony/uid bridge to generate JobExecution ids (#138)
* Introduce symfony/uid bridge to generate JobExecution ids * Configure job execution id generator in Symfony app * Add reference to new bridge everywhere * Fix compatibility with Symfony 6.4 * Add documentation about JobExecution id generator being customizable in a Symfony app
1 parent 10b3890 commit 05714fc

File tree

6 files changed

+137
-6
lines changed

6 files changed

+137
-6
lines changed

src/DependencyInjection/Configuration.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Yokai\Batch\Bridge\Symfony\Framework\DependencyInjection;
66

77
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
8+
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
89
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
910
use Symfony\Component\Config\Definition\ConfigurationInterface;
1011

@@ -15,6 +16,7 @@
1516
* storage: StorageConfig,
1617
* launcher: LauncherConfig,
1718
* parameters: ParametersConfig,
19+
* id: string,
1820
* ui: UserInterfaceConfig,
1921
* }
2022
* @phpstan-type StorageConfig array{
@@ -65,6 +67,7 @@ public function getConfigTreeBuilder(): TreeBuilder
6567
->append($this->storage())
6668
->append($this->launcher())
6769
->append($this->parameters())
70+
->append($this->id())
6871
->append($this->ui())
6972
->end()
7073
;
@@ -178,6 +181,24 @@ private function parameters(): ArrayNodeDefinition
178181
return $node;
179182
}
180183

184+
private function id(): NodeDefinition
185+
{
186+
/** @var ArrayNodeDefinition $node */
187+
$node = (new TreeBuilder('root'))->getRootNode();
188+
189+
$node
190+
->addDefaultsIfNotSet()
191+
->children()
192+
->enumNode('id')
193+
->values(JobExecutionIdGeneratorDefinitionFactory::TYPES)
194+
->defaultValue(JobExecutionIdGeneratorDefinitionFactory::DEFAULT)
195+
->end()
196+
->end()
197+
;
198+
199+
return $node->getChildNodeDefinitions()['id'];
200+
}
201+
181202
private function ui(): ArrayNodeDefinition
182203
{
183204
/** @var ArrayNodeDefinition $node */
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\Batch\Bridge\Symfony\Framework\DependencyInjection;
6+
7+
use Symfony\Component\DependencyInjection\Definition;
8+
use Symfony\Component\DependencyInjection\Exception\LogicException;
9+
use Symfony\Component\DependencyInjection\Reference;
10+
use Yokai\Batch\Bridge\Symfony\Uid\Factory\RandomBasedUuidJobExecutionIdGenerator;
11+
use Yokai\Batch\Bridge\Symfony\Uid\Factory\TimeBasedUuidJobExecutionIdGenerator;
12+
use Yokai\Batch\Bridge\Symfony\Uid\Factory\UlidJobExecutionIdGenerator;
13+
use Yokai\Batch\Factory\UniqidJobExecutionIdGenerator;
14+
15+
/**
16+
* This is a helper for building services definitions of {@see JobExecutionIdGeneratorInterface}.
17+
*/
18+
final class JobExecutionIdGeneratorDefinitionFactory
19+
{
20+
public const TYPES = [
21+
self::UNIQID,
22+
self::SYMFONY_RANDOM_UUID,
23+
self::SYMFONY_TIME_UUID,
24+
self::SYMFONY_ULID,
25+
];
26+
public const DEFAULT = self::UNIQID;
27+
28+
private const UNIQID = 'uniqid';
29+
private const SYMFONY_RANDOM_UUID = 'symfony.uuid.random';
30+
private const SYMFONY_TIME_UUID = 'symfony.uuid.time';
31+
private const SYMFONY_ULID = 'symfony.ulid';
32+
33+
/**
34+
* Build a service definition for configured type.
35+
*/
36+
public static function fromType(string $type): Definition
37+
{
38+
return match ($type) {
39+
self::UNIQID => self::uniqid(),
40+
self::SYMFONY_RANDOM_UUID => self::symfonyRandomUuid(),
41+
self::SYMFONY_TIME_UUID => self::symfonyTimeUuid(),
42+
self::SYMFONY_ULID => self::symfonyUlid(),
43+
default => throw new LogicException('Unsupported job job execution id generator type "' . $type . '".'),
44+
};
45+
}
46+
47+
private static function uniqid(): Definition
48+
{
49+
return new Definition(UniqidJobExecutionIdGenerator::class);
50+
}
51+
52+
private static function symfonyRandomUuid(): Definition
53+
{
54+
return new Definition(RandomBasedUuidJobExecutionIdGenerator::class, [
55+
'$uuidFactory' => new Reference('uuid.factory'),
56+
]);
57+
}
58+
59+
private static function symfonyTimeUuid(): Definition
60+
{
61+
return new Definition(TimeBasedUuidJobExecutionIdGenerator::class, [
62+
'$uuidFactory' => new Reference('uuid.factory'),
63+
]);
64+
}
65+
66+
private static function symfonyUlid(): Definition
67+
{
68+
return new Definition(UlidJobExecutionIdGenerator::class, [
69+
'$ulidFactory' => new Reference('ulid.factory'),
70+
]);
71+
}
72+
}

src/DependencyInjection/YokaiBatchExtension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Yokai\Batch\Bridge\Symfony\Framework\UserInterface\Templating\ConfigurableTemplating;
2323
use Yokai\Batch\Bridge\Symfony\Framework\UserInterface\Templating\SonataAdminTemplating;
2424
use Yokai\Batch\Bridge\Symfony\Framework\UserInterface\Templating\TemplatingInterface;
25+
use Yokai\Batch\Factory\JobExecutionIdGeneratorInterface;
2526
use Yokai\Batch\Factory\JobExecutionParametersBuilder\PerJobJobExecutionParametersBuilder;
2627
use Yokai\Batch\Factory\JobExecutionParametersBuilder\StaticJobExecutionParametersBuilder;
2728
use Yokai\Batch\Launcher\JobLauncherInterface;
@@ -68,6 +69,9 @@ public function load(array $configs, ContainerBuilder $container): void
6869
$this->configureParameters($container, $config['parameters']);
6970
$this->configureUserInterface($container, $loader, $config['ui']);
7071

72+
$jobExecutionIdGeneratorDefinition = JobExecutionIdGeneratorDefinitionFactory::fromType($config['id']);
73+
$container->setDefinition(JobExecutionIdGeneratorInterface::class, $jobExecutionIdGeneratorDefinition);
74+
7175
$container->registerAliasForArgument('yokai_batch.logger', LoggerInterface::class, 'yokaiBatchLogger');
7276
}
7377

src/Resources/services/global/alias.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
<service id="Yokai\Batch\Job\JobExecutor"
2020
alias="yokai_batch.job_executor"/>
2121

22-
<service id="Yokai\Batch\Factory\JobExecutionIdGeneratorInterface"
23-
alias="yokai_batch.job_execution_id_generator.uniqid"/>
24-
2522
<service id="Yokai\Batch\Factory\JobExecutionParametersBuilderInterface"
2623
alias="yokai_batch.job_execution_parameters_builder.chain"/>
2724
</services>

src/Resources/services/global/core.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@
3131
<argument type="service" id="event_dispatcher" on-invalid="null"/>
3232
</service>
3333

34-
<service id="yokai_batch.job_execution_id_generator.uniqid"
35-
class="Yokai\Batch\Factory\UniqidJobExecutionIdGenerator"/>
36-
3734
<service id="yokai_batch.job_execution_parameters_builder.chain"
3835
class="Yokai\Batch\Factory\JobExecutionParametersBuilder\ChainJobExecutionParametersBuilder">
3936
<argument type="tagged_iterator" tag="yokai_batch.job_execution_parameters_builder"/>

tests/DependencyInjection/YokaiBatchExtensionTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,15 @@
1919
use Yokai\Batch\Bridge\Symfony\Framework\UserInterface\Templating\SonataAdminTemplating;
2020
use Yokai\Batch\Bridge\Symfony\Framework\UserInterface\Templating\TemplatingInterface;
2121
use Yokai\Batch\Bridge\Symfony\Messenger\DispatchMessageJobLauncher;
22+
use Yokai\Batch\Bridge\Symfony\Uid\Factory\RandomBasedUuidJobExecutionIdGenerator;
23+
use Yokai\Batch\Bridge\Symfony\Uid\Factory\TimeBasedUuidJobExecutionIdGenerator;
24+
use Yokai\Batch\Bridge\Symfony\Uid\Factory\UlidJobExecutionIdGenerator;
25+
use Yokai\Batch\Factory\JobExecutionIdGeneratorInterface;
2226
use Yokai\Batch\Factory\JobExecutionParametersBuilder\ChainJobExecutionParametersBuilder;
2327
use Yokai\Batch\Factory\JobExecutionParametersBuilder\PerJobJobExecutionParametersBuilder;
2428
use Yokai\Batch\Factory\JobExecutionParametersBuilder\StaticJobExecutionParametersBuilder;
2529
use Yokai\Batch\Factory\JobExecutionParametersBuilderInterface;
30+
use Yokai\Batch\Factory\UniqidJobExecutionIdGenerator;
2631
use Yokai\Batch\Launcher\JobLauncherInterface;
2732
use Yokai\Batch\Launcher\SimpleJobLauncher;
2833
use Yokai\Batch\Storage\FilesystemJobExecutionStorage;
@@ -377,6 +382,41 @@ public function errors(): \Generator
377382
];
378383
}
379384

385+
/**
386+
* @dataProvider id
387+
*/
388+
public function testId(array $config, string $idGenerator): void
389+
{
390+
$container = $this->createContainer($config);
391+
392+
$idGeneratorDefinition = $this->getDefinition($container, JobExecutionIdGeneratorInterface::class);
393+
self::assertSame($idGenerator, $idGeneratorDefinition->getClass());
394+
}
395+
396+
public function id(): \Generator
397+
{
398+
yield 'Default config' => [
399+
[],
400+
UniqidJobExecutionIdGenerator::class,
401+
];
402+
yield 'Explicit uniqid' => [
403+
['id' => 'uniqid'],
404+
UniqidJobExecutionIdGenerator::class,
405+
];
406+
yield 'Symfony random based UUID' => [
407+
['id' => 'symfony.uuid.random'],
408+
RandomBasedUuidJobExecutionIdGenerator::class,
409+
];
410+
yield 'Symfony time based UUID' => [
411+
['id' => 'symfony.uuid.time'],
412+
TimeBasedUuidJobExecutionIdGenerator::class,
413+
];
414+
yield 'Symfony ULID' => [
415+
['id' => 'symfony.ulid'],
416+
UlidJobExecutionIdGenerator::class,
417+
];
418+
}
419+
380420
private function createContainer(array $config, \Closure|null $configure = null): ContainerBuilder
381421
{
382422
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)