Last active
March 3, 2024 10:08
-
-
Save vudaltsov/ec01012d3fe27c9eed59aa7fd9089cf7 to your computer and use it in GitHub Desktop.
Doctrine PostgreSQL Default Schema Fix For Symfony
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
declare(strict_types=1); | |
namespace App\Doctrine\EventListener; | |
use Doctrine\DBAL\Schema\PostgreSQLSchemaManager; | |
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs; | |
final class FixPostgreSQLDefaultSchemaListener | |
{ | |
/** | |
* @throws \Doctrine\DBAL\Exception | |
*/ | |
public function postGenerateSchema(GenerateSchemaEventArgs $args): void | |
{ | |
$schemaManager = $args | |
->getEntityManager() | |
->getConnection() | |
->createSchemaManager(); | |
if (!$schemaManager instanceof PostgreSQLSchemaManager) { | |
return; | |
} | |
$schema = $args->getSchema(); | |
foreach ($schemaManager->listSchemaNames() as $namespace) { | |
if (!$schema->hasNamespace($namespace)) { | |
$schema->createNamespace($namespace); | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
declare(strict_types=1); | |
use App\Doctrine\EventListener\FixPostgreSQLDefaultSchemaListener; | |
use Doctrine\ORM\Tools\ToolEvents; | |
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; | |
return static function (ContainerConfigurator $configurator): void { | |
$services = $configurator->services(); | |
$services | |
->set(FixPostgreSQLDefaultSchemaListener::class) | |
->tag('doctrine.event_listener', ['event' => ToolEvents::postGenerateSchema]); | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
services: | |
App\Doctrine\EventListener\FixPostgreSQLDefaultSchemaListener: | |
tags: | |
- { name: doctrine.event_listener, event: postGenerateSchema } |
Thank you @stetodd .
One more addition to the changes @stetodd suggested to remove usage of a deprecated methods from doctrine/orm 2.13: change ->getSchemaManager()
into ->createSchemaManager()
.
Also, when using Symfony 5.3 or up (and yaml config) you can use a when@dev
statement to add the listener like so:
when@dev:
services:
App\Doctrine\EventListener\FixPostgreSQLDefaultSchemaListener:
tags:
- { name: doctrine.event_listener, event: postGenerateSchema }
Created a new gist for a complete overview: https://gist.github.com/mvmaasakkers/7c28355715850d991fb9feb649e60463
Thank you all for the interest! I've updated the snippet to match the latest Doctrine contracts.
Can be configured right in attributes.
use Symfony\Component\DependencyInjection\Attribute\AutoconfigureTag;
use Symfony\Component\DependencyInjection\Attribute\When;
#[When('dev')]
#[AutoconfigureTag('doctrine.event_listener', ['event' => ToolEvents::postGenerateSchema])]
final class FixPostgreSQLDefaultSchemaListener
{
}
Using attributes to register the event listener per the documentation:
// FixPostgreSQLDefaultSchemaListener.php
#[AsDoctrineListener(event: ToolEvents::postGenerateSchema, connection: 'default')]
final class FixPostgreSQLDefaultSchemaListener
{
// implementation
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I've just upgraded from v2 to v3 and had to make changes to this listener. The main change was to:
foreach ($schemaManager->getExistingSchemaSearchPaths() as $namespace) {
to use
listSchemaNames()
instead:foreach ($schemaManager->listSchemaNames() as $namespace) {
getExistingSchemaSearchPaths()
is internal andlistSchemaNames()
is public.getExistingSchemaSearchPaths()
also wasn't providing the expected set of namespaces.