8000 Proof of concept for automatically updating Doctrine Schema from Mess… · symfony/symfony@4ecf58d · GitHub
[go: up one dir, main page]

Skip to content

Commit 4ecf58d

Browse files
committed
Proof of concept for automatically updating Doctrine Schema from Messenger
1 parent c30d6f9 commit 4ecf58d

File tree

3 files changed

+75
-2
lines changed

3 files changed

+75
-2
lines changed

src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Doctrine\DBAL\Schema\Schema;
2020
use Doctrine\DBAL\Schema\Synchronizer\SchemaSynchronizer;
2121
use Doctrine\DBAL\Schema\Synchronizer\SingleDatabaseSynchronizer;
22+
use Doctrine\DBAL\Schema\Table;
2223
use Doctrine\DBAL\Types\Type;
2324
use Doctrine\DBAL\Types\Types;
2425
use Symfony\Component\Messenger\Exception\InvalidArgumentException;
@@ -290,6 +291,23 @@ public function find($id): ?array
290291
return false === $data ? null : $this->decodeEnvelopeHeaders($data);
291292
}
292293

294+
public function configureSchema(Schema $schema): void
295+
{
296+
if ($schema->hasTable($this->configuration['table_name'])) {
297+
return;
298+
}
299+
300+
$this->addTableToSchema($schema);
301+
}
302+
303+
/**
304+
* @internal
305+
*/
306+
public function getDbalConnection(): DBALConnection
307+
{
308+
return $this->driverConnection;
309+
}
310+
293311
private function createAvailableMessagesQueryBuilder(): QueryBuilder
294312
{
295313
$now = new \DateTime();
@@ -341,6 +359,13 @@ private function executeQuery(string $sql, array $parameters = [], array $types
341359
private function getSchema(): Schema
342360
{
343361
$schema = new Schema([], [], $this->driverConnection->getSchemaManager()->createSchemaConfig());
362+
$this->addTableToSchema($schema);
363+
364+
return $schema;
365+
}
366+
367+
private function addTableToSchema(Schema $schema): void
368+
{
344369
$table = $schema->createTable($this->configuration['table_name']);
345370
$table->addColumn('id', self::$useDeprecatedConstants ? Type::BIGINT : Types::BIGINT)
346371
->setAutoincrement(true)
@@ -361,8 +386,6 @@ private function getSchema(): Schema
361386
$table->addIndex(['queue_name']);
362387
$table->addIndex(['available_at']);
363388
$table->addIndex(['delivered_at']);
364-
365-
return $schema;
366389
}
367390

368391
private function decodeEnvelopeHeaders(array $doctrineEnvelope): array

src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php

Lines changed: 12 additions & 0 deletions
8000
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\Messenger\Bridge\Doctrine\Transport;
1313

14+
use Doctrine\DBAL\Connection as DbalConnection;
15+
use Doctrine\DBAL\Schema\Schema;
1416
use Symfony\Component\Messenger\Envelope;
1517
use Symfony\Component\Messenger\Transport\Receiver\ListableReceiverInterface;
1618
use Symfony\Component\Messenger\Transport\Receiver\MessageCountAwareInterface;
@@ -98,6 +100,16 @@ public function setup(): void
98100
$this->connection->setup();
99101
}
100102

103+
public function configureSchema(Schema $schema, DbalConnection $dbalConnection): void
104+
{
105+
// only update the schema for the correct connection
106+
if ($dbalConnection !== $this->connection->getDbalConnection()) {
107+
return;
108+
}
109+
110+
$this->connection->configureSchema($schema);
111+
}
112+
101113
private function getReceiver(): DoctrineReceiver
102114
{
103115
return $this->receiver = new DoctrineReceiver($this->connection, $this->serializer);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace Symfony\Component\Messenger\Bridge\Doctrine\Transport;
4+
5+
use Doctrine\Common\EventSubscriber;
6+
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
7+
use Doctrine\ORM\Tools\ToolEvents;
8+
use Symfony\Component\Messenger\Transport\TransportInterface;
9+
10+
class MessengerTransportDoctrineSchemaSubscriber implements EventSubscriber
11+
{
12+
private $transports;
13+
14+
/**
15+
* @param iterable|TransportInterface[] $transports
16+
*/
17+
public function __construct(iterable $transports)
18+
{
19+
$this->transports = $transports;
20+
}
21+
22+
public function postGenerateSchema(GenerateSchemaEventArgs $event)
23+
{
24+
$dbalConnection = $event->getEntityManager()->getConnection();
25+
foreach ($this->transports as $transport) {
26+
if (!$transport instanceof DoctrineTransport) {
27+
continue;
28+
}
29+
30+
$transport->configureSchema($event->getSchema(), $dbalConnection);
31+
}
32+
}
33+
34+
public function getSubscribedEvents()
35+
{
36+
return [ToolEvents::postGenerateSchema];
37+
}
38+
}

0 commit comments

Comments
 (0)
0