[PostgreSQL] Add PostgreSQLDefaultSchemaListener

This commit is contained in:
Rafikooo 2023-04-20 17:51:42 +02:00
parent 2a56716441
commit 9d2030a0f3
No known key found for this signature in database
GPG key ID: 4A26D8327BC2442B
3 changed files with 145 additions and 0 deletions

View file

@ -0,0 +1,55 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Sylius\Bundle\CoreBundle\EventListener;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Schema\AbstractSchemaManager;
use Doctrine\DBAL\Schema\PostgreSQLSchemaManager;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
final class PostgreSQLDefaultSchemaListener
{
public function postGenerateSchema(GenerateSchemaEventArgs $args): void
{
$connection = $args->getEntityManager()->getConnection();
$schemaManager = $this->createSchemaManager($connection);
if (!is_a($schemaManager, PostgreSQLSchemaManager::class)) {
return;
}
$schema = $args->getSchema();
foreach ($schemaManager->listSchemaNames() as $namespace) {
if (!$schema->hasNamespace($namespace)) {
$schema->createNamespace($namespace);
}
}
}
private function createSchemaManager(Connection $connection): AbstractSchemaManager
{
if (method_exists($connection, 'createSchemaManager')) {
return $connection->createSchemaManager();
}
if (method_exists($connection, 'getSchemaManager')) {
/** @psalm-suppress DeprecatedMethod */
return $connection->getSchemaManager();
}
throw new \RuntimeException('Cannot create schema manager');
}
}

View file

@ -19,6 +19,7 @@
<argument type="service" id="sylius.repository.channel" />
<tag name="kernel.event_listener" event="sylius.channel.pre_delete" method="onChannelPreDelete" />
</service>
<service id="sylius.listener.images_upload" class="Sylius\Bundle\CoreBundle\EventListener\ImagesUploadListener">
<argument type="service" id="sylius.image_uploader" />
<tag name="kernel.event_listener" event="sylius.product.pre_create" method="uploadImages" />
@ -26,6 +27,7 @@
<tag name="kernel.event_listener" event="sylius.taxon.pre_create" method="uploadImages" />
<tag name="kernel.event_listener" event="sylius.taxon.pre_update" method="uploadImages" />
</service>
<service id="sylius.listener.images_remove" class="Sylius\Bundle\CoreBundle\EventListener\ImagesRemoveListener">
<argument type="service" id="sylius.image_uploader" />
<argument type="service" id="liip_imagine.cache.manager" />
@ -33,23 +35,28 @@
<tag name="doctrine.event_listener" event="onFlush" lazy="true" />
<tag name="doctrine.event_listener" event="postFlush" lazy="true" />
</service>
<service id="sylius.listener.avatar_upload" class="Sylius\Bundle\CoreBundle\EventListener\ImageUploadListener">
<argument type="service" id="sylius.image_uploader" />
<tag name="kernel.event_listener" event="sylius.admin_user.pre_create" method="uploadImage" />
<tag name="kernel.event_listener" event="sylius.admin_user.pre_update" method="uploadImage" />
</service>
<service id="sylius.listener.order_recalculation" class="Sylius\Bundle\CoreBundle\EventListener\OrderRecalculationListener">
<argument type="service" id="sylius.order_processing.order_processor" />
<tag name="kernel.event_listener" event="sylius.cart_change" method="recalculateOrder" />
</service>
<service id="sylius.listener.default_username" class="Sylius\Bundle\CoreBundle\EventListener\DefaultUsernameORMListener">
<tag name="doctrine.event_listener" event="onFlush" lazy="true" />
</service>
<service id="sylius.listener.canonicalizer" class="Sylius\Bundle\CoreBundle\EventListener\CanonicalizerListener">
<argument type="service" id="sylius.canonicalizer" />
<tag name="doctrine.event_listener" event="prePersist" lazy="true" />
<tag name="doctrine.event_listener" event="preUpdate" lazy="true" />
</service>
<service id="sylius.listener.password_updater" class="Sylius\Bundle\CoreBundle\EventListener\PasswordUpdaterListener">
<argument type="service" id="sylius.security.password_updater" />
<tag name="kernel.event_listener" event="sylius.user.pre_password_reset" method="genericEventUpdater" />
@ -59,6 +66,7 @@
<tag name="doctrine.event_listener" event="prePersist" lazy="true" />
<tag name="doctrine.event_listener" event="preUpdate" lazy="true" />
</service>
<service id="sylius.listener.review_create" class="Sylius\Bundle\CoreBundle\EventListener\ReviewCreateListener">
<argument type="service" id="sylius.context.customer" />
<tag name="kernel.event_listener" event="sylius.product_review.pre_create" method="ensureReviewHasAuthor" />
@ -101,5 +109,9 @@
<argument type="service" id="Sylius\Component\Core\Promotion\Updater\Rule\ContainsProductRuleUpdater" />
<tag name="kernel.event_listener" event="sylius.product.post_delete" method="removeProductFromPromotionRules" />
</service>
<service id="Sylius\Bundle\CoreBundle\EventListener\PostgreSQLDefaultSchemaListener">
<tag name="doctrine.event_listener" event="postGenerateSchema" method="postGenerateSchema" lazy="true" />
</service>
</services>
</container>

View file

@ -0,0 +1,78 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace spec\Sylius\Bundle\CoreBundle\EventListener;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Schema\MySQLSchemaManager;
use Doctrine\DBAL\Schema\PostgreSQLSchemaManager;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
use PhpSpec\ObjectBehavior;
final class PostgreSQLDefaultSchemaListenerSpec extends ObjectBehavior
{
function it_does_nothing_if_schema_manager_is_not_postgresql(
Connection $connection,
EntityManagerInterface $entityManager,
GenerateSchemaEventArgs $args,
MySQLSchemaManager $schemaManager,
): void {
$connection->createSchemaManager()->willReturn($schemaManager);
$entityManager->getConnection()->willReturn($connection);
$args->getEntityManager()->willReturn($entityManager);
$args->getSchema()->shouldNotBeCalled();
$schemaManager->listSchemaNames()->shouldNotBeCalled();
$this->postGenerateSchema($args);
}
function it_creates_namespaces_for_all_schemas_in_the_current_database_if_schema_manager_is_postgresql(
Connection $connection,
EntityManagerInterface $entityManager,
GenerateSchemaEventArgs $args,
PostgreSQLSchemaManager $schemaManager,
Schema $schema,
): void {
$connection->createSchemaManager()->willReturn($schemaManager);
$entityManager->getConnection()->willReturn($connection);
$args->getEntityManager()->willReturn($entityManager);
$schemaManager->listSchemaNames()->willReturn(['public', 'information_schema']);
$args->getSchema()->willReturn($schema);
$schema->hasNamespace('public')->willReturn(false);
$schema->hasNamespace('information_schema')->willReturn(false);
$schema->createNamespace('public')->shouldBeCalled();
$schema->createNamespace('information_schema')->shouldBeCalled();
$this->postGenerateSchema($args);
}
function it_throws_an_exception_if_schema_manager_cannot_be_created(
Connection $connection,
EntityManagerInterface $entityManager,
GenerateSchemaEventArgs $args,
): void {
$connection->createSchemaManager()->willThrow(\RuntimeException::class);
$entityManager->getConnection()->willReturn($connection);
$args->getEntityManager()->willReturn($entityManager);
$args->getSchema()->shouldNotBeCalled();
$this->shouldThrow(\RuntimeException::class)->during('postGenerateSchema', [$args]);
}
}