|
6 | 6 |
|
7 | 7 | use Doctrine\DBAL\Connection; |
8 | 8 | use Doctrine\DBAL\DriverManager; |
| 9 | +use Doctrine\DBAL\Tools\DsnParser; |
9 | 10 | use Enqueue\Dsn\Dsn; |
10 | 11 | use Interop\Queue\ConnectionFactory; |
11 | 12 | use Interop\Queue\Context; |
@@ -142,13 +143,35 @@ private function parseDsn(string $dsn, ?array $config = null): array |
142 | 143 | ]; |
143 | 144 | } |
144 | 145 |
|
| 146 | + if (class_exists(DsnParser::class)) { // DBAL >= 4 |
| 147 | + if ($dsnHasProtocolOnly) { |
| 148 | + $dsn = $parsedDsn->getScheme().'://root@localhost'; |
| 149 | + } |
| 150 | + |
| 151 | + $doctrineSupported = []; |
| 152 | + foreach ($supported as $k => $v) { |
| 153 | + $doctrineSupported[$this->prepareDsnForDoctrine($k)] = $this->prepareDsnForDoctrine($v); |
| 154 | + } |
| 155 | + $dsnParser = new DsnParser($doctrineSupported); |
| 156 | + |
| 157 | + return [ |
| 158 | + 'lazy' => true, |
| 159 | + 'connection' => $dsnParser->parse($this->prepareDsnForDoctrine($dsn)), |
| 160 | + ]; |
| 161 | + } |
| 162 | + |
| 163 | + $dsn = $dsnHasProtocolOnly ? |
| 164 | + $doctrineScheme.'://root@localhost' : |
| 165 | + str_replace($parsedDsn->getScheme(), $doctrineScheme, $dsn); |
| 166 | + |
145 | 167 | return [ |
146 | 168 | 'lazy' => true, |
147 | | - 'connection' => [ |
148 | | - 'url' => $dsnHasProtocolOnly ? |
149 | | - $doctrineScheme.'://root@localhost' : |
150 | | - str_replace($parsedDsn->getScheme(), $doctrineScheme, $dsn), |
151 | | - ], |
| 169 | + 'connection' => ['url' => $dsn], |
152 | 170 | ]; |
153 | 171 | } |
| 172 | + |
| 173 | + private function prepareDsnForDoctrine(string $dsn): string |
| 174 | + { |
| 175 | + return preg_replace('/^([a-z0-9]+)\+pdo/i', 'pdo-$1', $dsn); |
| 176 | + } |
154 | 177 | } |
0 commit comments