Skip to content

Commit 087967b

Browse files
committed
trigger unique messages at runtime using MessageProvider
1 parent e326290 commit 087967b

File tree

5 files changed

+27
-20
lines changed

5 files changed

+27
-20
lines changed

src/Symfony/Component/Scheduler/RecurringMessage.php

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@
1616
use Symfony\Component\Scheduler\Trigger\CallbackMessageProvider;
1717
use Symfony\Component\Scheduler\Trigger\CronExpressionTrigger;
1818
use Symfony\Component\Scheduler\Trigger\JitterTrigger;
19-
use Symfony\Component\Scheduler\Trigger\MessageProvider;
19+
use Symfony\Component\Scheduler\Trigger\MessageProviderInterface;
2020
use Symfony\Component\Scheduler\Trigger\PeriodicalTrigger;
2121
use Symfony\Component\Scheduler\Trigger\TriggerInterface;
2222

23-
final class RecurringMessage implements MessageProvider
23+
final class RecurringMessage implements MessageProviderInterface
2424
{
2525
private string $id;
2626

2727
private function __construct(
2828
private readonly TriggerInterface $trigger,
29-
private readonly MessageProvider $provider,
29+
private readonly MessageProviderInterface $provider,
3030
) {
3131
}
3232

@@ -61,19 +61,16 @@ public static function cron(string $expression, object $message, \DateTimeZone|s
6161
return self::trigger(CronExpressionTrigger::fromSpec($expression, (string) $message, $timezone), $message);
6262
}
6363

64+
/**
65+
* @param MessageProviderInterface|object $message A message provider that yields messages or a static message that will be dispatched on every trigger.
66+
*/
6467
public static function trigger(TriggerInterface $trigger, object $message): self
6568
{
66-
if ($message instanceof MessageProvider) {
69+
if ($message instanceof MessageProviderInterface) {
6770
return new self($trigger, $message);
6871
}
6972

70-
try {
71-
$description = $message instanceof \Stringable ? (string) $message : '';
72-
} catch (\Exception) {
73-
$description = $message::class;
74-
}
75-
76-
return new self($trigger, new CallbackMessageProvider(static fn (): array => [$message], $description));
73+
return new self($trigger, new CallbackMessageProvider(static fn (): array => [$message], $message instanceof \Stringable ? (string) $message : ''));
7774
}
7875

7976
public function withJitter(int $maxSeconds = 60): self
@@ -103,7 +100,7 @@ public function getMessages(MessageContext $context): iterable
103100
return $this->provider->getMessages($context);
104101
}
105102

106-
public function getProvider(): MessageProvider
103+
public function getProvider(): MessageProviderInterface
107104
{
108105
return $this->provider;
109106
}

src/Symfony/Component/Scheduler/Tests/Generator/MessageGeneratorTest.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ public function testYieldedContext()
130130

131131
public static function messagesProvider(): \Generator
132132
{
133-
$first = (object) ['id' => 'first'];
134-
$second = (object) ['id' => 'second'];
135-
$third = (object) ['id' => 'third'];
133+
$first = new Message(['id' => 'first']);
134+
$second = new Message(['id' => 'second']);
135+
$third = new Message(['id' => 'third']);
136136

137137
yield 'first' => [
138138
'startTime' => '22:12:00',
@@ -262,3 +262,14 @@ private static function makeDateTime(string $time): \DateTimeImmutable
262262
return new \DateTimeImmutable('2020-02-20T'.$time, new \DateTimeZone('UTC'));
263263
}
264264
}
265+
266+
class Message {
267+
public function __construct(private readonly array $data)
268+
{
269+
}
270+
271+
public function __toString(): string
272+
{
273+
return (string) spl_object_id($this);
274+
}
275+
}

src/Symfony/Component/Scheduler/Tests/Trigger/CallbackMessageProviderTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public function testToString()
2323
$context = new MessageContext('test', 'test', $this->createMock(TriggerInterface::class), $this->createMock(\DateTimeImmutable::class));
2424
$messageProvider = new CallbackMessageProvider(fn () => []);
2525
$this->assertEquals([], $messageProvider->getMessages($context));
26-
$this->assertMatchesRegularExpression('/^[\da-f]{32}$/', (string) $messageProvider);
26+
$this->assertEquals('', (string) $messageProvider);
2727

2828
$messageProvider = new CallbackMessageProvider(fn () => [new \stdClass()], '');
2929
$this->assertEquals([new \stdClass()], $messageProvider->getMessages($context));

src/Symfony/Component/Scheduler/Trigger/CallbackMessageProvider.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,15 @@
1313

1414
use Symfony\Component\Scheduler\Generator\MessageContext;
1515

16-
final class CallbackMessageProvider implements MessageProvider, \Stringable
16+
final class CallbackMessageProvider implements MessageProviderInterface, \Stringable
1717
{
1818
private \Closure $callback;
19-
20-
private ?string $description;
19+
private string $description;
2120

2221
public function __construct(callable $callback, string $description = '')
2322
{
2423
$this->callback = $callback(...);
25-
$this->description = $description ?? spl_object_hash($this->callback);
24+
$this->description = $description;
2625
}
2726

2827
public function getMessages(MessageContext $context): iterable

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy