2021-04-18 22:24:02 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace DigiComp\FlowSymfonyBridge\Messenger\Transport;
|
|
|
|
|
|
|
|
use Doctrine\DBAL\Driver\AbstractPostgreSQLDriver;
|
|
|
|
use Doctrine\ORM\EntityManagerInterface;
|
2022-09-18 13:17:53 +02:00
|
|
|
use Neos\Flow\Annotations as Flow;
|
2021-04-18 22:24:02 +02:00
|
|
|
use Symfony\Component\Messenger\Bridge\Doctrine\Transport\Connection;
|
|
|
|
use Symfony\Component\Messenger\Bridge\Doctrine\Transport\DoctrineTransport;
|
|
|
|
use Symfony\Component\Messenger\Bridge\Doctrine\Transport\PostgreSqlConnection;
|
|
|
|
use Symfony\Component\Messenger\Exception\TransportException;
|
|
|
|
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
|
|
|
|
use Symfony\Component\Messenger\Transport\TransportFactoryInterface;
|
|
|
|
use Symfony\Component\Messenger\Transport\TransportInterface;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @Flow\Scope("singleton")
|
|
|
|
*/
|
|
|
|
class FlowDoctrineTransportFactory implements TransportFactoryInterface
|
|
|
|
{
|
|
|
|
private EntityManagerInterface $entityManager;
|
|
|
|
|
|
|
|
public function __construct(EntityManagerInterface $entityManager)
|
|
|
|
{
|
|
|
|
$this->entityManager = $entityManager;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function createTransport(string $dsn, array $options, SerializerInterface $serializer): TransportInterface
|
|
|
|
{
|
|
|
|
$useNotify = ($options['use_notify'] ?? true);
|
|
|
|
unset($options['transport_name'], $options['use_notify']);
|
|
|
|
// Always allow PostgreSQL-specific keys, to be able to transparently fallback to the native driver
|
|
|
|
// when LISTEN/NOTIFY isn't available
|
|
|
|
$configuration = PostgreSqlConnection::buildConfiguration($dsn, $options);
|
|
|
|
|
|
|
|
try {
|
|
|
|
$driverConnection = $this->entityManager->getConnection();
|
|
|
|
} catch (\InvalidArgumentException $e) {
|
2022-09-18 13:17:53 +02:00
|
|
|
throw new TransportException(\sprintf(
|
2021-04-18 22:24:02 +02:00
|
|
|
'Could not find Doctrine connection from Messenger DSN "%s".',
|
|
|
|
$dsn
|
|
|
|
), 0, $e);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($useNotify && $driverConnection->getDriver() instanceof AbstractPostgreSQLDriver) {
|
|
|
|
$connection = new PostgreSqlConnection($configuration, $driverConnection);
|
|
|
|
} else {
|
|
|
|
$connection = new Connection($configuration, $driverConnection);
|
|
|
|
}
|
|
|
|
|
|
|
|
return new DoctrineTransport($connection, $serializer);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritDoc
|
|
|
|
*/
|
|
|
|
public function supports(string $dsn, array $options): bool
|
|
|
|
{
|
2022-09-18 13:17:53 +02:00
|
|
|
return 0 === \strpos($dsn, 'flow-doctrine://');
|
2021-04-18 22:24:02 +02:00
|
|
|
}
|
|
|
|
}
|