Skip to content

Commit

Permalink
Drop dbal 2, improve configuration and add attributes (#549)
Browse files Browse the repository at this point in the history
  • Loading branch information
jordisala1991 committed Feb 28, 2023
1 parent 9581652 commit 09feffb
Show file tree
Hide file tree
Showing 74 changed files with 484 additions and 79 deletions.
12 changes: 6 additions & 6 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@
"require": {
"php": "^7.4 || ^8.0",
"doctrine/collections": "^1.8 || ^2.0",
"doctrine/common": "^3.1",
"doctrine/dbal": "^2.13 || ^3.0",
"doctrine/common": "^3.3",
"doctrine/dbal": "^3.4",
"doctrine/event-manager": "^1.2 || ^2.0",
"doctrine/orm": "^2.10",
"doctrine/persistence": "^2.2 || ^3.0",
"doctrine/orm": "^2.14",
"doctrine/persistence": "^3.0",
"psr/clock": "^1.0",
"symfony/config": "^4.4 || ^5.4 || ^6.0",
"symfony/dependency-injection": "^4.4 || ^5.4 || ^6.0",
Expand All @@ -27,7 +27,7 @@
"doctrine/doctrine-bundle": "^2.4.4",
"doctrine/doctrine-fixtures-bundle": "^3.4",
"friendsofphp/php-cs-fixer": "^3.4",
"gedmo/doctrine-extensions": "^3.0",
"gedmo/doctrine-extensions": "^3.7",
"matthiasnoback/symfony-dependency-injection-test": "^4.2.1",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^1.0",
Expand All @@ -54,7 +54,7 @@
"conflict": {
"doctrine/annotations": "<1.7",
"doctrine/doctrine-bundle": "<2.4.4",
"gedmo/doctrine-extensions": "<3.0",
"gedmo/doctrine-extensions": "<3.7",
"symfony/framework-bundle": "<4.4"
},
"autoload": {
Expand Down
39 changes: 18 additions & 21 deletions src/EventListener/CreateSchemaListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Doctrine\DBAL\Schema\Column;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
Expand Down Expand Up @@ -44,10 +45,9 @@ public function __construct(AuditManager $auditManager)
}

/**
* @todo Remove the "@return array" docblock when support for "symfony/error-handler" 5.x is dropped.
*
* @return string[]
*/
#[\ReturnTypeWillChange]
public function getSubscribedEvents()
{
return [
Expand Down Expand Up @@ -115,23 +115,16 @@ public function postGenerateSchemaTable(GenerateSchemaTableEventArgs $eventArgs)
}

$revisionForeignKeyName = $this->config->getRevisionFieldName().'_'.md5($revisionTable->getName()).'_fk';
$primaryKey = $revisionsTable->getPrimaryKey();
\assert(null !== $primaryKey);

// TODO: Use always array_keys when dropping support for DBAL 2
$keyColumns = $revisionsTable->getPrimaryKeyColumns();
$firstColumn = current($keyColumns);
if ($firstColumn instanceof Column) {
/** @var string[] $foreignColumnNames */
$foreignColumnNames = array_keys($keyColumns);
} else {
/**
* @phpstan-ignore-next-line
*
* @var string[] $foreignColumnNames
*/
$foreignColumnNames = $keyColumns;
}

$revisionTable->addForeignKeyConstraint($revisionsTable, [$this->config->getRevisionFieldName()], $foreignColumnNames, [], $revisionForeignKeyName);
$revisionTable->addForeignKeyConstraint(
$revisionsTable,
[$this->config->getRevisionFieldName()],
$primaryKey->getColumns(),
[],
$revisionForeignKeyName
);
}

public function postGenerateSchema(GenerateSchemaEventArgs $eventArgs): void
Expand All @@ -150,7 +143,11 @@ public function postGenerateSchema(GenerateSchemaEventArgs $eventArgs): void
private function addColumnToTable(Column $column, Table $targetTable): void
{
$columnName = $column->getName();
$targetTable->addColumn($columnName, $column->getType()->getName());

$targetTable->addColumn(
$columnName,
Type::getTypeRegistry()->lookupName($column->getType())
);

$targetColumn = $targetTable->getColumn($columnName);
$targetColumn->setLength($column->getLength());
Expand All @@ -162,7 +159,6 @@ private function addColumnToTable(Column $column, Table $targetTable): void
$targetColumn->setColumnDefinition($column->getColumnDefinition());
$targetColumn->setComment($column->getComment());
$targetColumn->setPlatformOptions($column->getPlatformOptions());
$targetColumn->setCustomSchemaOptions($column->getCustomSchemaOptions());

$targetColumn->setNotnull(false);
$targetColumn->setAutoincrement(false);
Expand Down Expand Up @@ -196,14 +192,15 @@ private function createRevisionJoinTableForJoinTable(Schema $schema, string $joi
return;
}

$typeRegistry = Type::getTypeRegistry();
$revisionJoinTable = $schema->createTable(
$this->config->getTablePrefix().$joinTable->getName().$this->config->getTableSuffix()
);
foreach ($joinTable->getColumns() as $column) {
/* @var Column $column */
$revisionJoinTable->addColumn(
$column->getName(),
$column->getType()->getName(),
$typeRegistry->lookupName($column->getType()),
['notnull' => false, 'autoincrement' => false]
);
}
Expand Down
26 changes: 12 additions & 14 deletions src/EventListener/LogRevisionsListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Event\PostFlushEventArgs;
use Doctrine\ORM\Event\PostPersistEventArgs;
use Doctrine\ORM\Event\PostUpdateEventArgs;
use Doctrine\ORM\Events;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Persisters\Entity\EntityPersister;
Expand Down Expand Up @@ -80,10 +81,9 @@ public function __construct(AuditManager $auditManager, ?ClockInterface $clock =
}

/**
* @todo Remove the "@return string[]" docblock when support for "symfony/error-handler" 5.x is dropped.
*
* @return string[]
*/
#[\ReturnTypeWillChange]
public function getSubscribedEvents()
{
return [Events::onFlush, Events::postPersist, Events::postUpdate, Events::postFlush, Events::onClear];
Expand All @@ -96,7 +96,7 @@ public function getSubscribedEvents()
*/
public function postFlush(PostFlushEventArgs $eventArgs): void
{
$em = $eventArgs->getEntityManager();
$em = $eventArgs->getObjectManager();
$conn = $em->getConnection();
$platform = $conn->getDatabasePlatform();
$quoteStrategy = $em->getConfiguration()->getQuoteStrategy();
Expand All @@ -122,9 +122,7 @@ public function postFlush(PostFlushEventArgs $eventArgs): void
$fieldType = $meta->getTypeOfField($field);
if (null !== $fieldType) {
$type = Type::getType($fieldType);
if ($type->canRequireSQLConversion()) {
$placeholder = $type->convertToDatabaseValueSQL('?', $platform);
}
$placeholder = $type->convertToDatabaseValueSQL('?', $platform);
}
}

Expand Down Expand Up @@ -201,11 +199,11 @@ public function postFlush(PostFlushEventArgs $eventArgs): void
$this->deferredChangedManyToManyEntityRevisionsToPersist = [];
}

public function postPersist(LifecycleEventArgs $eventArgs): void
public function postPersist(PostPersistEventArgs $eventArgs): void
{
$em = $eventArgs->getEntityManager();
$em = $eventArgs->getObjectManager();
// onFlush was executed before, everything already initialized
$entity = $eventArgs->getEntity();
$entity = $eventArgs->getObject();

$class = $em->getClassMetadata(\get_class($entity));
if (!$this->metadataFactory->isAudited($class->name)) {
Expand All @@ -219,13 +217,13 @@ public function postPersist(LifecycleEventArgs $eventArgs): void
$this->saveRevisionEntityData($em, $class, $entityData, 'INS');
}

public function postUpdate(LifecycleEventArgs $eventArgs): void
public function postUpdate(PostUpdateEventArgs $eventArgs): void
{
$em = $eventArgs->getEntityManager();
$em = $eventArgs->getObjectManager();
$uow = $em->getUnitOfWork();

// onFlush was executed before, everything already initialized
$entity = $eventArgs->getEntity();
$entity = $eventArgs->getObject();

$class = $em->getClassMetadata(\get_class($entity));
if (!$this->metadataFactory->isAudited($class->name)) {
Expand Down Expand Up @@ -261,7 +259,7 @@ public function onClear(): void

public function onFlush(OnFlushEventArgs $eventArgs): void
{
$em = $eventArgs->getEntityManager();
$em = $eventArgs->getObjectManager();
$uow = $em->getUnitOfWork();
$this->revisionId = null; // reset revision

Expand Down
11 changes: 10 additions & 1 deletion tests/App/AppKernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
use Symfony\Component\HttpFoundation\InputBag;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
use Symfony\Component\Security\Http\Attribute\IsGranted;

final class AppKernel extends Kernel
{
Expand Down Expand Up @@ -73,12 +74,20 @@ protected function configureContainer(ContainerBuilder $containerBuilder, Loader

$loader->load(__DIR__.'/config/config.yml');

if (class_exists(InputBag::class)) {
if (class_exists(IsGranted::class)) {
$loader->load(__DIR__.'/config/config_symfony_v6.yml');
} elseif (class_exists(InputBag::class)) {
$loader->load(__DIR__.'/config/config_symfony_v5.yml');
} else {
$loader->load(__DIR__.'/config/config_symfony_v4.yml');
}

if (version_compare(\PHP_VERSION, '8.0.0', '>=')) {
$loader->load(__DIR__.'/config/config_php8.yml');
} else {
$loader->load(__DIR__.'/config/config_php7.yml');
}

$loader->load(__DIR__.'/config/services.php');
}

Expand Down
7 changes: 7 additions & 0 deletions tests/App/Entity/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@

namespace Sonata\EntityAuditBundle\Tests\App\Entity;

use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="bundle_user")
*/
#[ORM\Entity]
#[ORM\Table(name: 'bundle_user')]
class User
{
/**
Expand All @@ -28,11 +31,15 @@ class User
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
#[ORM\Id]
#[ORM\Column(type: Types::INTEGER)]
#[ORM\GeneratedValue]
protected $id;

/**
* @ORM\Column(type="string")
*/
#[ORM\Column(type: Types::STRING)]
private string $name;

public function __construct(string $name)
Expand Down
9 changes: 0 additions & 9 deletions tests/App/config/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,6 @@ parameters:
doctrine:
dbal:
url: "%env(resolve:DATABASE_URL)%"
orm:
auto_generate_proxy_classes: true
auto_mapping: true
mappings:
AuditEntityTest:
type: annotation
dir: "%kernel.project_dir%/Entity"
is_bundle: false
prefix: Sonata\EntityAuditBundle\Tests\App\Entity

simple_things_entity_audit:
revision_table_name: bundle_revisions
Expand Down
10 changes: 10 additions & 0 deletions tests/App/config/config_php7.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
doctrine:
orm:
auto_generate_proxy_classes: true
auto_mapping: true
mappings:
AuditEntityTest:
type: annotation
dir: "%kernel.project_dir%/Entity"
is_bundle: false
prefix: Sonata\EntityAuditBundle\Tests\App\Entity
10 changes: 10 additions & 0 deletions tests/App/config/config_php8.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
doctrine:
orm:
auto_generate_proxy_classes: true
auto_mapping: true
mappings:
AuditEntityTest:
type: attribute
dir: "%kernel.project_dir%/Entity"
is_bundle: false
prefix: Sonata\EntityAuditBundle\Tests\App\Entity
10 changes: 10 additions & 0 deletions tests/App/config/config_symfony_v6.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
framework:
session:
storage_factory_id: session.storage.factory.mock_file
router:
utf8: true

security:
firewalls:
main:
lazy: true
Loading

0 comments on commit 09feffb

Please sign in to comment.