mirror of
https://github.com/Sylius/Sylius.git
synced 2026-07-14 17:10:53 +00:00
[PostgreSQL] Add PostgreSQLDefaultSchemaListener
This commit is contained in:
parent
2a56716441
commit
9d2030a0f3
3 changed files with 145 additions and 0 deletions
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue