diff --git a/config/set/knplabs/doctrine-gedmo-to-knplabs.yaml b/config/set/knplabs/doctrine-gedmo-to-knplabs.yaml index 9fe2323605a..1cc54b87fc8 100644 --- a/config/set/knplabs/doctrine-gedmo-to-knplabs.yaml +++ b/config/set/knplabs/doctrine-gedmo-to-knplabs.yaml @@ -6,3 +6,4 @@ services: Rector\DoctrineGedmoToKnplabs\Rector\Class_\TranslationBehaviorRector: null Rector\DoctrineGedmoToKnplabs\Rector\Class_\SoftDeletableBehaviorRector: null Rector\DoctrineGedmoToKnplabs\Rector\Class_\BlameableBehaviorRector: null + Rector\DoctrineGedmoToKnplabs\Rector\Class_\LoggableBehaviorRector: null diff --git a/packages/BetterPhpDocParser/src/AnnotationReader/AnnotationReaderFactory.php b/packages/BetterPhpDocParser/src/AnnotationReader/AnnotationReaderFactory.php index b06efcfd33d..f9718457465 100644 --- a/packages/BetterPhpDocParser/src/AnnotationReader/AnnotationReaderFactory.php +++ b/packages/BetterPhpDocParser/src/AnnotationReader/AnnotationReaderFactory.php @@ -46,6 +46,9 @@ final class AnnotationReaderFactory $annotationReader::addGlobalIgnoredName('Gedmo\Blameable'); $annotationReader::addGlobalIgnoredName('Blameable'); + $annotationReader::addGlobalIgnoredName('Gedmo\Versioned'); + $annotationReader::addGlobalIgnoredName('Versioned'); + // nette @inject dummy annotation $annotationReader::addGlobalIgnoredName('inject'); diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Gedmo/LoggableTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Gedmo/LoggableTagValueNode.php new file mode 100644 index 00000000000..9e7db6b3fda --- /dev/null +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Gedmo/LoggableTagValueNode.php @@ -0,0 +1,42 @@ +logEntryClass = $logEntryClass; + } + + public function __toString(): string + { + $contentItems = []; + + if ($this->logEntryClass !== null) { + $contentItems['logEntryClass'] = $this->logEntryClass; + } + + return $this->printContentItems($contentItems); + } +} diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Gedmo/VersionedTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Gedmo/VersionedTagValueNode.php new file mode 100644 index 00000000000..c01bc74e0ca --- /dev/null +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Gedmo/VersionedTagValueNode.php @@ -0,0 +1,26 @@ +nodeAnnotationReader->readClassAnnotation($node, $this->getClass()); + if ($loggable === null) { + return null; + } + + return new LoggableTagValueNode($loggable->logEntryClass); + } +} diff --git a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Gedmo/VersionedPhpDocNodeFactory.php b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Gedmo/VersionedPhpDocNodeFactory.php new file mode 100644 index 00000000000..9c897678484 --- /dev/null +++ b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Gedmo/VersionedPhpDocNodeFactory.php @@ -0,0 +1,39 @@ +nodeAnnotationReader->readPropertyAnnotation($node, $this->getClass()); + if ($loggable === null) { + return null; + } + + return new VersionedTagValueNode(); + } +} diff --git a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/LoggableBehaviorRector.php b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/LoggableBehaviorRector.php new file mode 100644 index 00000000000..bc08094d76f --- /dev/null +++ b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/LoggableBehaviorRector.php @@ -0,0 +1,132 @@ +classManipulator = $classManipulator; + } + + public function getDefinition(): RectorDefinition + { + return new RectorDefinition('Change Loggable from gedmo/doctrine-extensions to knplabs/doctrine-behaviors', [ + new CodeSample( + <<<'PHP' +use Gedmo\Mapping\Annotation as Gedmo; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity + * @Gedmo\Loggable + */ +class SomeClass +{ + /** + * @Gedmo\Versioned + * @ORM\Column(name="title", type="string", length=8) + */ + private $title; +} +PHP +, + <<<'PHP' +use Doctrine\ORM\Mapping as ORM; +use Knp\DoctrineBehaviors\Model\Loggable\LoggableTrait; +use Knp\DoctrineBehaviors\Contract\Entity\LoggableInterface; + +/** + * @ORM\Entity + */ +class SomeClass implements LoggableInterface +{ + use LoggableTrait; + + /** + * @ORM\Column(name="title", type="string", length=8) + */ + private $title; +} +PHP + + ), + ]); + } + + /** + * @return string[] + */ + public function getNodeTypes(): array + { + return [Class_::class]; + } + + /** + * @param Class_ $node + */ + public function refactor(Node $node): ?Node + { + // change the node + $classPhpDocInfo = $this->getPhpDocInfo($node); + if ($classPhpDocInfo === null) { + return null; + } + + if (! $classPhpDocInfo->hasByType(LoggableTagValueNode::class)) { + return null; + } + + $classPhpDocInfo->removeByType(LoggableTagValueNode::class); + $this->docBlockManipulator->updateNodeWithPhpDocInfo($node, $classPhpDocInfo); + + // remove tag from properties + $this->removeVersionedTagFromProperties($node); + + $this->classManipulator->addAsFirstTrait($node, 'Knp\DoctrineBehaviors\Model\Loggable\LoggableTrait'); + + $node->implements[] = new FullyQualified('Knp\DoctrineBehaviors\Contract\Entity\LoggableInterface'); + + return $node; + } + + private function removeVersionedTagFromProperties(Class_ $class): void + { + foreach ($class->getProperties() as $property) { + $propertyPhpDocInfo = $this->getPhpDocInfo($property); + if ($propertyPhpDocInfo === null) { + continue; + } + + if (! $propertyPhpDocInfo->hasByType(VersionedTagValueNode::class)) { + continue; + } + + $propertyPhpDocInfo->removeByType(VersionedTagValueNode::class); + $this->docBlockManipulator->updateNodeWithPhpDocInfo($property, $propertyPhpDocInfo); + } + } +} diff --git a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/SluggableBehaviorRector.php b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/SluggableBehaviorRector.php index 41a8b558612..c57ba98c105 100644 --- a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/SluggableBehaviorRector.php +++ b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/SluggableBehaviorRector.php @@ -19,6 +19,9 @@ use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\RectorDefinition; /** + * @see https://github.com/Atlantic18/DoctrineExtensions/blob/v2.4.x/doc/sluggable.md + * @see https://github.com/KnpLabs/DoctrineBehaviors/blob/4e0677379dd4adf84178f662d08454a9627781a8/docs/sluggable.md + * * @see \Rector\DoctrineGedmoToKnplabs\Tests\Rector\Class_\SluggableBehaviorRector\SluggableBehaviorRectorTest */ final class SluggableBehaviorRector extends AbstractRector diff --git a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/SoftDeletableBehaviorRector.php b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/SoftDeletableBehaviorRector.php index b81971463e5..a4229ecc241 100644 --- a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/SoftDeletableBehaviorRector.php +++ b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/SoftDeletableBehaviorRector.php @@ -14,6 +14,9 @@ use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\RectorDefinition; /** + * @see https://github.com/Atlantic18/DoctrineExtensions/blob/v2.4.x/doc/softdeleteable.md + * @see https://github.com/KnpLabs/DoctrineBehaviors/blob/4e0677379dd4adf84178f662d08454a9627781a8/docs/soft-deletable.md + * * @see \Rector\DoctrineGedmoToKnplabs\Tests\Rector\Class_\SoftDeletableBehaviorRector\SoftDeletableBehaviorRectorTest */ final class SoftDeletableBehaviorRector extends AbstractRector diff --git a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TimestampableBehaviorRector.php b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TimestampableBehaviorRector.php index 84c1d1c401a..7bbace04247 100644 --- a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TimestampableBehaviorRector.php +++ b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TimestampableBehaviorRector.php @@ -13,6 +13,9 @@ use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\RectorDefinition; /** + * @see https://github.com/Atlantic18/DoctrineExtensions/blob/v2.4.x/doc/timestampable.md + * @see https://github.com/KnpLabs/DoctrineBehaviors/blob/4e0677379dd4adf84178f662d08454a9627781a8/docs/timestampable.md + * * @see \Rector\DoctrineGedmoToKnplabs\Tests\Rector\Class_\TimestampableBehaviorRector\TimestampableBehaviorRectorTest */ final class TimestampableBehaviorRector extends AbstractRector diff --git a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TranslationBehaviorRector.php b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TranslationBehaviorRector.php index ec2868d2887..74def6f8bc5 100644 --- a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TranslationBehaviorRector.php +++ b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TranslationBehaviorRector.php @@ -22,6 +22,9 @@ use Rector\RectorDefinition\RectorDefinition; use Symplify\SmartFileSystem\SmartFileInfo; /** + * @see https://github.com/Atlantic18/DoctrineExtensions/blob/v2.4.x/doc/translatable.md + * @see https://github.com/KnpLabs/DoctrineBehaviors/blob/4e0677379dd4adf84178f662d08454a9627781a8/docs/translatable.md + * * @see https://lab.axioma.lv/symfony2/pagebundle/commit/062f9f87add5740ea89072e376dd703f3188d2ce * * @see \Rector\DoctrineGedmoToKnplabs\Tests\Rector\Class_\TranslationBehaviorRector\TranslationBehaviorRectorTest diff --git a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TreeBehaviorRector.php b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TreeBehaviorRector.php index 1ff37fc94df..f88b64ef754 100644 --- a/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TreeBehaviorRector.php +++ b/packages/DoctrineGedmoToKnplabs/src/Rector/Class_/TreeBehaviorRector.php @@ -20,6 +20,9 @@ use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\RectorDefinition; /** + * @see https://github.com/Atlantic18/DoctrineExtensions/blob/v2.4.x/doc/tree.md + * @see https://github.com/KnpLabs/DoctrineBehaviors/blob/4e0677379dd4adf84178f662d08454a9627781a8/docs/tree.md + * * @see \Rector\DoctrineGedmoToKnplabs\Tests\Rector\Class_\TreeBehaviorRector\TreeBehaviorRectorTest */ final class TreeBehaviorRector extends AbstractRector diff --git a/packages/DoctrineGedmoToKnplabs/tests/Rector/Class_/LoggableBehaviorRector/Fixture/fixture.php.inc b/packages/DoctrineGedmoToKnplabs/tests/Rector/Class_/LoggableBehaviorRector/Fixture/fixture.php.inc new file mode 100644 index 00000000000..72fa21dd8a0 --- /dev/null +++ b/packages/DoctrineGedmoToKnplabs/tests/Rector/Class_/LoggableBehaviorRector/Fixture/fixture.php.inc @@ -0,0 +1,42 @@ + +----- + diff --git a/packages/DoctrineGedmoToKnplabs/tests/Rector/Class_/LoggableBehaviorRector/LoggableBehaviorRectorTest.php b/packages/DoctrineGedmoToKnplabs/tests/Rector/Class_/LoggableBehaviorRector/LoggableBehaviorRectorTest.php new file mode 100644 index 00000000000..a34f193dfcd --- /dev/null +++ b/packages/DoctrineGedmoToKnplabs/tests/Rector/Class_/LoggableBehaviorRector/LoggableBehaviorRectorTest.php @@ -0,0 +1,30 @@ +doTestFile($file); + } + + public function provideDataForTest(): Iterator + { + return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + protected function getRectorClass(): string + { + return LoggableBehaviorRector::class; + } +} diff --git a/stubs/Gedmo/Mapping/Annotation/Loggable.php b/stubs/Gedmo/Mapping/Annotation/Loggable.php new file mode 100644 index 00000000000..ab40b94558e --- /dev/null +++ b/stubs/Gedmo/Mapping/Annotation/Loggable.php @@ -0,0 +1,22 @@ +