diff --git a/DependencyInjection/Compiler/DoctrineOrmMappingsPass.php b/DependencyInjection/Compiler/DoctrineOrmMappingsPass.php index 68ff12f2..249b6ca0 100644 --- a/DependencyInjection/Compiler/DoctrineOrmMappingsPass.php +++ b/DependencyInjection/Compiler/DoctrineOrmMappingsPass.php @@ -11,8 +11,8 @@ namespace Hackzilla\Bundle\TicketBundle\DependencyInjection\Compiler; -use Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator; use Doctrine\ORM\Mapping\Driver\XmlDriver; +use Doctrine\Persistence\Mapping\Driver\SymfonyFileLocator; use Hackzilla\Bundle\TicketBundle\DependencyInjection\HackzillaTicketExtension; use Hackzilla\Bundle\TicketBundle\Entity\Ticket; use Hackzilla\Bundle\TicketBundle\Entity\TicketMessage; diff --git a/DependencyInjection/HackzillaTicketExtension.php b/DependencyInjection/HackzillaTicketExtension.php index a9e27910..febc0612 100644 --- a/DependencyInjection/HackzillaTicketExtension.php +++ b/DependencyInjection/HackzillaTicketExtension.php @@ -50,6 +50,10 @@ public function load(array $configs, ContainerBuilder $container) } $this->setTranslationDomain($config, $container); + + if (isset($bundles['FOSUserBundle'])) { + $this->createDoctrineCommonBackwardCompatibilityAliases(); + } } public static function bundleDirectory() @@ -74,4 +78,19 @@ private function setTranslationDomain(array $config, ContainerBuilder $container $definition = $container->getDefinition('hackzilla_ticket.ticket_manager'); $definition->addMethodCall('setTranslationDomain', [$translationDomain]); } + + /** + * We MUST remove this method when support for "friendsofsymfony/user-bundle" is dropped + * or adapted to work with "doctrine/common:^3". + */ + private function createDoctrineCommonBackwardCompatibilityAliases(): void + { + if (!interface_exists(\Doctrine\Common\Persistence\ObjectManager::class)) { + class_alias(\Doctrine\Persistence\ObjectManager::class, \Doctrine\Common\Persistence\ObjectManager::class); + } + + if (!class_exists(\Doctrine\Common\Persistence\Event\LifecycleEventArgs::class)) { + class_alias(\Doctrine\Persistence\Event\LifecycleEventArgs::class, \Doctrine\Common\Persistence\Event\LifecycleEventArgs::class); + } + } } diff --git a/Manager/TicketManager.php b/Manager/TicketManager.php index 34411bf4..41087a28 100644 --- a/Manager/TicketManager.php +++ b/Manager/TicketManager.php @@ -11,7 +11,8 @@ namespace Hackzilla\Bundle\TicketBundle\Manager; -use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\ObjectManager as LegacyObjectManager; +use Doctrine\Persistence\ObjectManager; use Hackzilla\Bundle\TicketBundle\Entity\TicketMessage; use Hackzilla\Bundle\TicketBundle\Model\TicketInterface; use Hackzilla\Bundle\TicketBundle\Model\TicketMessageInterface; @@ -54,10 +55,21 @@ public function __construct($ticketClass, $ticketMessageClass) $this->ticketMessageClass = $ticketMessageClass; } + public function setObjectManager(ObjectManager $objectManager): void + { + $this->objectManager = $objectManager; + $this->ticketRepository = $objectManager->getRepository($this->ticketClass); + $this->messageRepository = $objectManager->getRepository($this->ticketMessageClass); + } + /** + * NEXT_MAJOR: Remove this method. + * + * @deprecated since hackzilla/ticket-bundle 3.x, use `setObjectManager()` instead. + * * @return $this */ - public function setEntityManager(ObjectManager $om) + public function setEntityManager(LegacyObjectManager $om) { $this->objectManager = $om; $this->ticketRepository = $om->getRepository($this->ticketClass); diff --git a/Manager/TicketManagerInterface.php b/Manager/TicketManagerInterface.php index 87813a8d..127d9919 100644 --- a/Manager/TicketManagerInterface.php +++ b/Manager/TicketManagerInterface.php @@ -11,18 +11,23 @@ namespace Hackzilla\Bundle\TicketBundle\Manager; -use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\ObjectManager as LegacyObjectManager; use Doctrine\ORM\QueryBuilder; +use Doctrine\Persistence\ObjectManager; use Hackzilla\Bundle\TicketBundle\Model\TicketInterface; use Hackzilla\Bundle\TicketBundle\Model\TicketMessageInterface; use Symfony\Component\Translation\TranslatorInterface; /** * @method QueryBuilder getTicketListQuery(UserManagerInterface $userManager, $ticketStatus, $ticketPriority = null) + * @method void setObjectManager(ObjectManager $objectManager) */ interface TicketManagerInterface { - public function setEntityManager(ObjectManager $om); + /** + * @deprecated since hackzilla/ticket-bundle 3.x, use `setObjectManager()` instead. + */ + public function setEntityManager(LegacyObjectManager $om); public function setTranslator(TranslatorInterface $translator); diff --git a/Manager/UserManager.php b/Manager/UserManager.php index 713a8194..b76bf087 100644 --- a/Manager/UserManager.php +++ b/Manager/UserManager.php @@ -11,7 +11,7 @@ namespace Hackzilla\Bundle\TicketBundle\Manager; -use Doctrine\Common\Persistence\ObjectRepository; +use Doctrine\Persistence\ObjectRepository; use Hackzilla\Bundle\TicketBundle\Model\TicketInterface; use Hackzilla\Bundle\TicketBundle\Model\UserInterface; use Hackzilla\Bundle\TicketBundle\TicketRole; diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 39f1d461..3f3d5128 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -26,7 +26,7 @@ services: - '%hackzilla_ticket.model.ticket.class%' - '%hackzilla_ticket.model.message.class%' calls: - - [ setEntityManager, ['@doctrine.orm.entity_manager'] ] + - [ setObjectManager, ['@doctrine.orm.entity_manager'] ] - [ setTranslator, ['@translator'] ] public: true diff --git a/Tests/Manager/TicketManagerTest.php b/Tests/Manager/TicketManagerTest.php index 3658cdfd..7cdfbebf 100644 --- a/Tests/Manager/TicketManagerTest.php +++ b/Tests/Manager/TicketManagerTest.php @@ -11,9 +11,9 @@ namespace Hackzilla\Bundle\TicketBundle\Tests\User; -use Doctrine\Common\Persistence\ObjectManager; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\QueryBuilder; +use Doctrine\Persistence\ObjectManager; use Hackzilla\Bundle\TicketBundle\Manager\TicketManager; use Hackzilla\Bundle\TicketBundle\Manager\UserManagerInterface; use Hackzilla\Bundle\TicketBundle\Model\TicketMessageInterface; @@ -65,7 +65,7 @@ public function testGetTicketListQuery() ->willReturn($entityRepository); $ticketManager = new TicketManager($ticketClass, $ticketMessageClass); - $ticketManager->setEntityManager($om); + $ticketManager->setObjectManager($om); $this->assertInstanceOf(QueryBuilder::class, $ticketManager->getTicketListQuery($this->userManager, TicketMessageInterface::STATUS_OPEN)); } @@ -100,7 +100,7 @@ public function testGetTicketList() ->willReturn($entityRepository); $ticketManager = new TicketManager($ticketClass, $ticketMessageClass); - $ticketManager->setEntityManager($om); + $ticketManager->setObjectManager($om); $this->assertInstanceOf(QueryBuilder::class, $ticketManager->getTicketList($this->userManager, TicketMessageInterface::STATUS_OPEN)); } diff --git a/composer.json b/composer.json index d93de33a..9455f19e 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,7 @@ "doctrine/collections": "^1.6", "doctrine/doctrine-bundle": "^2.0", "doctrine/orm": "^2.4.8", - "doctrine/persistence": "^1.3", + "doctrine/persistence": "^1.3 || ^2.1", "knplabs/knp-paginator-bundle": "^4.0 || ^5.0", "symfony/config": "^4.4", "symfony/console": "^4.4", diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 4db0542f..878ae3ea 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -7,3 +7,6 @@ parameters: - Tests/ ignoreErrors: - '#.* (class|type) Vich\\UploaderBundle\\.*#' + - '#^Class Doctrine\\Common\\Persistence\\ObjectManager not found\.$#' + - '#^Class Doctrine\\Common\\Persistence\\Event\\LifecycleEventArgs not found\.$#' + - '#^Parameter \$om of method Hackzilla\\Bundle\\TicketBundle\\Manager\\TicketManager(Interface)?::setEntityManager\(\) has invalid typehint type Doctrine\\Common\\Persistence\\ObjectManager\.$#'