diff --git a/composer.json b/composer.json index 4edc956117..59b3551316 100644 --- a/composer.json +++ b/composer.json @@ -57,7 +57,7 @@ "doctrine/orm": "^2.10.2", "friendsofphp/php-cs-fixer": "^3.4.0,<3.10", "nesbot/carbon": "^2.55", - "phpstan/phpstan": "^1.1", + "phpstan/phpstan": "^1.9", "phpstan/phpstan-doctrine": "^1.0", "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^8.5 || ^9.5", diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 248d919799..c14b5b6d07 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -110,16 +110,6 @@ parameters: count: 1 path: src/Mapping/Event/Adapter/ORM.php - - - message: "#^Access to an undefined property Doctrine\\\\Persistence\\\\Mapping\\\\ClassMetadata\\:\\:\\$isMappedSuperclass\\.$#" - count: 1 - path: src/Mapping/ExtensionMetadataFactory.php - - - - message: "#^Access to an undefined property Doctrine\\\\Persistence\\\\Mapping\\\\ClassMetadata\\:\\:\\$reflClass\\.$#" - count: 1 - path: src/Mapping/ExtensionMetadataFactory.php - - message: "#^Call to an undefined method Doctrine\\\\Persistence\\\\Mapping\\\\Driver\\\\MappingDriver\\:\\:getDefaultDriver\\(\\)\\.$#" count: 2 @@ -211,17 +201,17 @@ parameters: path: src/References/Mapping/Event/Adapter/ORM.php - - message: "#^Call to an undefined method Doctrine\\\\Persistence\\\\ObjectManager\\:\\:getReference\\(\\)\\.$#" + message: "#^Call to an undefined method Doctrine\\\\Persistence\\\\ObjectManager\\:\\:getUnitOfWork\\(\\)\\.$#" count: 1 path: src/References/Mapping/Event/Adapter/ORM.php - - message: "#^Call to an undefined method Doctrine\\\\Persistence\\\\ObjectManager\\:\\:getUnitOfWork\\(\\)\\.$#" - count: 1 + message: "#^Call to method getClassMetadata\\(\\) on an unknown class Doctrine\\\\ODM\\\\PHPCR\\\\DocumentManager\\.$#" + count: 2 path: src/References/Mapping/Event/Adapter/ORM.php - - message: "#^Call to method getClassMetadata\\(\\) on an unknown class Doctrine\\\\ODM\\\\PHPCR\\\\DocumentManager\\.$#" + message: "#^Call to method getReference\\(\\) on an unknown class Doctrine\\\\ODM\\\\PHPCR\\\\DocumentManager\\.$#" count: 1 path: src/References/Mapping/Event/Adapter/ORM.php @@ -230,11 +220,6 @@ parameters: count: 2 path: src/References/Mapping/Event/Adapter/ORM.php - - - message: "#^Parameter \\$dm of method Gedmo\\\\References\\\\Mapping\\\\Event\\\\Adapter\\\\ORM\\:\\:throwIfNotDocumentManager\\(\\) has invalid type Doctrine\\\\ODM\\\\PHPCR\\\\DocumentManager\\.$#" - count: 1 - path: src/References/Mapping/Event/Adapter/ORM.php - - message: "#^Access to an undefined property Doctrine\\\\Persistence\\\\Mapping\\\\ClassMetadata\\\\:\\:\\$reflClass\\.$#" count: 4 @@ -445,21 +430,6 @@ parameters: count: 2 path: src/Tool/Wrapper/MongoDocumentWrapper.php - - - message: "#^Right side of && is always true\\.$#" - count: 2 - path: src/Translatable/Document/Repository/TranslationRepository.php - - - - message: "#^Negated boolean expression is always false\\.$#" - count: 1 - path: src/Translatable/Entity/Repository/TranslationRepository.php - - - - message: "#^Right side of && is always true\\.$#" - count: 2 - path: src/Translatable/Entity/Repository/TranslationRepository.php - - message: "#^Access to offset 'inherited' on an unknown class Doctrine\\\\ODM\\\\MongoDB\\\\Mapping\\\\AssociationFieldMapping\\.$#" count: 1 @@ -540,11 +510,6 @@ parameters: count: 2 path: src/Tree/Entity/Repository/NestedTreeRepository.php - - - message: "#^Negated boolean expression is always true\\.$#" - count: 1 - path: src/Tree/Entity/Repository/NestedTreeRepository.php - - message: "#^Access to offset 'inherited' on an unknown class Doctrine\\\\ODM\\\\MongoDB\\\\Mapping\\\\AssociationFieldMapping\\.$#" count: 1 @@ -625,19 +590,9 @@ parameters: count: 1 path: src/Uploadable/UploadableListener.php - - - message: "#^Call to an undefined method Doctrine\\\\Persistence\\\\ObjectManager\\:\\:getConnection\\(\\)\\.$#" - count: 1 - path: src/Uploadable/UploadableListener.php - - - - message: "#^Call to an undefined method Doctrine\\\\Persistence\\\\ObjectManager\\:\\:getEventManager\\(\\)\\.$#" - count: 1 - path: src/Uploadable/UploadableListener.php - - message: "#^Call to an undefined method Doctrine\\\\Persistence\\\\ObjectManager\\:\\:getUnitOfWork\\(\\)\\.$#" - count: 4 + count: 3 path: src/Uploadable/UploadableListener.php - @@ -695,11 +650,6 @@ parameters: count: 1 path: tests/Gedmo/Timestampable/Fixture/ArticleCarbon.php - - - message: "#^Strict comparison using \\=\\=\\= between null and Doctrine\\\\DBAL\\\\Platforms\\\\AbstractPlatform will always evaluate to false\\.$#" - count: 1 - path: tests/Gedmo/Tool/BaseTestCaseORM.php - - message: "#^Call to static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) with 'Gedmo\\\\\\\\Translatable\\\\\\\\Document\\\\\\\\Repository\\\\\\\\TranslationRepository' and Doctrine\\\\ORM\\\\EntityRepository\\ will always evaluate to false\\.$#" count: 4 diff --git a/src/Loggable/Document/Repository/LogEntryRepository.php b/src/Loggable/Document/Repository/LogEntryRepository.php index 29d7e3e6b6..c44799e13f 100644 --- a/src/Loggable/Document/Repository/LogEntryRepository.php +++ b/src/Loggable/Document/Repository/LogEntryRepository.php @@ -89,15 +89,16 @@ public function revert($document, $version = 1) if ($logs instanceof Iterator) { $logs = $logs->toArray(); } - if ($logs) { - $data = []; - while ($log = array_shift($logs)) { - $data = array_merge($data, $log->getData()); - } - $this->fillDocument($document, $data); - } else { + + if ([] === $logs) { throw new \Gedmo\Exception\UnexpectedValueException('Count not find any log entries under version: '.$version); } + + $data = []; + while ($log = array_shift($logs)) { + $data = array_merge($data, $log->getData()); + } + $this->fillDocument($document, $data); } /** diff --git a/src/Loggable/Entity/Repository/LogEntryRepository.php b/src/Loggable/Entity/Repository/LogEntryRepository.php index b81ea3b7ed..5764ee94a7 100644 --- a/src/Loggable/Entity/Repository/LogEntryRepository.php +++ b/src/Loggable/Entity/Repository/LogEntryRepository.php @@ -101,28 +101,28 @@ public function revert($entity, $version = 1) $q->setParameters(compact('objectId', 'objectClass', 'version')); $logs = $q->getResult(); - if ($logs) { - $config = $this->getLoggableListener()->getConfiguration($this->_em, $objectMeta->getName()); - $fields = $config['versioned']; - $filled = false; - while (($log = array_pop($logs)) && !$filled) { - if ($data = $log->getData()) { - foreach ($data as $field => $value) { - if (in_array($field, $fields, true)) { - $this->mapValue($objectMeta, $field, $value); - $wrapped->setPropertyValue($field, $value); - unset($fields[array_search($field, $fields, true)]); - } + if ([] === $logs) { + throw new \Gedmo\Exception\UnexpectedValueException('Could not find any log entries under version: '.$version); + } + + $config = $this->getLoggableListener()->getConfiguration($this->_em, $objectMeta->getName()); + $fields = $config['versioned']; + $filled = false; + while (($log = array_pop($logs)) && !$filled) { + if ($data = $log->getData()) { + foreach ($data as $field => $value) { + if (in_array($field, $fields, true)) { + $this->mapValue($objectMeta, $field, $value); + $wrapped->setPropertyValue($field, $value); + unset($fields[array_search($field, $fields, true)]); } } - $filled = 0 === count($fields); } - /*if (count($fields)) { - throw new \Gedmo\Exception\UnexpectedValueException('Could not fully revert the entity to version: '.$version); - }*/ - } else { - throw new \Gedmo\Exception\UnexpectedValueException('Could not find any log entries under version: '.$version); + $filled = [] === $fields; } + /*if (count($fields)) { + throw new \Gedmo\Exception\UnexpectedValueException('Could not fully revert the entity to version: '.$version); + }*/ } /** diff --git a/src/Loggable/LoggableListener.php b/src/Loggable/LoggableListener.php index c21f84baa5..a9c7155ba3 100644 --- a/src/Loggable/LoggableListener.php +++ b/src/Loggable/LoggableListener.php @@ -319,7 +319,7 @@ protected function createLogEntry($action, $object, LoggableAdapter $ea) $logEntry->setData($newValues); } - if (LogEntryInterface::ACTION_UPDATE === $action && 0 === count($newValues)) { + if (LogEntryInterface::ACTION_UPDATE === $action && [] === $newValues) { return null; } diff --git a/src/Mapping/ExtensionMetadataFactory.php b/src/Mapping/ExtensionMetadataFactory.php index becd7d7e27..37f08588fc 100644 --- a/src/Mapping/ExtensionMetadataFactory.php +++ b/src/Mapping/ExtensionMetadataFactory.php @@ -96,7 +96,7 @@ public function __construct(ObjectManager $objectManager, string $extensionNames /** * Reads extension metadata * - * @param ClassMetadata $meta + * @param ClassMetadata&(DocumentClassMetadata|EntityClassMetadata) $meta * * @return array the metatada configuration */ diff --git a/src/References/Mapping/Event/Adapter/ODM.php b/src/References/Mapping/Event/Adapter/ODM.php index fdebcb1328..7ca6f30df6 100644 --- a/src/References/Mapping/Event/Adapter/ODM.php +++ b/src/References/Mapping/Event/Adapter/ODM.php @@ -58,7 +58,6 @@ public function getIdentifier($om, $object, $single = true) public function getSingleReference($om, $class, $identifier) { - $this->throwIfNotEntityManager($om); $meta = $om->getClassMetadata($class); if (!$meta->isInheritanceTypeNone()) { @@ -83,11 +82,4 @@ public function extractIdentifier($om, $object, $single = true) return [$meta->getIdentifier()[0] => $id]; } - - /** - * Override so we don't get an exception. We want to allow this. - */ - private function throwIfNotEntityManager(EntityManagerInterface $em): void - { - } } diff --git a/src/References/Mapping/Event/Adapter/ORM.php b/src/References/Mapping/Event/Adapter/ORM.php index ed35113f9f..407612f4a3 100644 --- a/src/References/Mapping/Event/Adapter/ORM.php +++ b/src/References/Mapping/Event/Adapter/ORM.php @@ -103,7 +103,9 @@ public function extractIdentifier($om, $object, $single = true) /** * Override so we don't get an exception. We want to allow this. * - * @param MongoDocumentManager|PhpcrDocumentManager $dm + * @param mixed $dm + * + * @phpstan-assert MongoDocumentManager|PhpcrDocumentManager $dm */ private function throwIfNotDocumentManager($dm): void { diff --git a/src/Sluggable/SluggableListener.php b/src/Sluggable/SluggableListener.php index 90e24d1712..522ed42bbc 100644 --- a/src/Sluggable/SluggableListener.php +++ b/src/Sluggable/SluggableListener.php @@ -306,7 +306,7 @@ private function generateSlug(SluggableAdapter $ea, object $object): void $config = $this->getConfiguration($om, $meta->getName()); foreach ($config['slugs'] as $slugField => $options) { - $hasHandlers = count($options['handlers']); + $hasHandlers = [] !== $options['handlers']; $options['useObjectClass'] = $config['useObjectClass']; // collect the slug from fields $slug = $meta->getReflectionProperty($slugField)->getValue($object); diff --git a/src/Sortable/Entity/Repository/SortableRepository.php b/src/Sortable/Entity/Repository/SortableRepository.php index 451870e237..19d5f7c0a2 100644 --- a/src/Sortable/Entity/Repository/SortableRepository.php +++ b/src/Sortable/Entity/Repository/SortableRepository.php @@ -83,7 +83,7 @@ public function getBySortableGroupsQueryBuilder(array $groupValues = []) } unset($groups[$name]); } - if (count($groups) > 0) { + if ([] !== $groups) { throw new \InvalidArgumentException('You need to specify values for the following groups to select by sortable groups: '.implode(', ', array_keys($groups))); } diff --git a/src/Sortable/Mapping/Event/Adapter/ORM.php b/src/Sortable/Mapping/Event/Adapter/ORM.php index c7709aa5df..ece9cc708c 100644 --- a/src/Sortable/Mapping/Event/Adapter/ORM.php +++ b/src/Sortable/Mapping/Event/Adapter/ORM.php @@ -80,7 +80,7 @@ public function updatePositions($relocation, $delta, $config) // add excludes if (!empty($delta['exclude'])) { $meta = $this->getObjectManager()->getClassMetadata($relocation['name']); - if (1 == count($meta->getIdentifier())) { + if (1 === count($meta->getIdentifier())) { // if we only have one identifier, we can use IN syntax, for better performance $excludedIds = []; foreach ($delta['exclude'] as $entity) { diff --git a/src/Sortable/SortableListener.php b/src/Sortable/SortableListener.php index 9e77d8dad9..a9bfecb655 100644 --- a/src/Sortable/SortableListener.php +++ b/src/Sortable/SortableListener.php @@ -598,7 +598,7 @@ protected function getMaxPosition(SortableAdapter $ea, $meta, $config, $object, $maxPos = null; // Get groups - if (!count($groups)) { + if ([] === $groups) { $groups = $this->getGroups($meta, $config, $object); } diff --git a/src/Translatable/Document/Repository/TranslationRepository.php b/src/Translatable/Document/Repository/TranslationRepository.php index a13d140741..fb1e614822 100644 --- a/src/Translatable/Document/Repository/TranslationRepository.php +++ b/src/Translatable/Document/Repository/TranslationRepository.php @@ -142,10 +142,8 @@ public function findTranslations($document) $q->setHydrate(false); $data = $q->execute(); - if ($data instanceof Iterator) { - $data = $data->toArray(); - } - if ($data && is_array($data) && count($data)) { + + if (is_iterable($data)) { foreach ($data as $row) { $result[$row['locale']][$row['field']] = $row['content']; } @@ -219,10 +217,7 @@ public function findTranslationsByObjectId($id) $q->setHydrate(false); $data = $q->execute(); - if ($data instanceof Iterator) { - $data = $data->toArray(); - } - if ($data && is_array($data) && count($data)) { + if (is_iterable($data)) { foreach ($data as $row) { $result[$row['locale']][$row['field']] = $row['content']; } diff --git a/src/Translatable/Entity/Repository/TranslationRepository.php b/src/Translatable/Entity/Repository/TranslationRepository.php index 1f43031ed3..7a03d51563 100644 --- a/src/Translatable/Entity/Repository/TranslationRepository.php +++ b/src/Translatable/Entity/Repository/TranslationRepository.php @@ -33,7 +33,7 @@ class TranslationRepository extends EntityRepository * Current TranslatableListener instance used * in EntityManager * - * @var TranslatableListener + * @var TranslatableListener|null */ private $listener; @@ -147,10 +147,8 @@ public function findTranslations($entity) Query::HYDRATE_ARRAY ); - if ($data && is_array($data) && count($data)) { - foreach ($data as $row) { - $result[$row['locale']][$row['field']] = $row['content']; - } + foreach ($data as $row) { + $result[$row['locale']][$row['field']] = $row['content']; } } @@ -184,9 +182,9 @@ public function findObjectByTranslatedField($field, $value, $class) $q->setParameters(compact('class', 'field', 'value')); $q->setMaxResults(1); $result = $q->getArrayResult(); - $id = count($result) ? $result[0]['foreignKey'] : null; + $id = $result[0]['foreignKey'] ?? null; - if ($id) { + if (null !== $id) { $entity = $this->_em->find($class, $id); } } @@ -218,10 +216,8 @@ public function findTranslationsByObjectId($id) Query::HYDRATE_ARRAY ); - if ($data && is_array($data) && count($data)) { - foreach ($data as $row) { - $result[$row['locale']][$row['field']] = $row['content']; - } + foreach ($data as $row) { + $result[$row['locale']][$row['field']] = $row['content']; } } @@ -235,7 +231,7 @@ public function findTranslationsByObjectId($id) */ private function getTranslatableListener(): TranslatableListener { - if (!$this->listener) { + if (null === $this->listener) { foreach ($this->_em->getEventManager()->getAllListeners() as $event => $listeners) { foreach ($listeners as $hash => $listener) { if ($listener instanceof TranslatableListener) { diff --git a/src/Translatable/Query/TreeWalker/TranslationWalker.php b/src/Translatable/Query/TreeWalker/TranslationWalker.php index 538f1d2999..615d5f7991 100644 --- a/src/Translatable/Query/TreeWalker/TranslationWalker.php +++ b/src/Translatable/Query/TreeWalker/TranslationWalker.php @@ -133,7 +133,7 @@ public function getExecutor($AST) public function walkSelectStatement(SelectStatement $AST) { $result = parent::walkSelectStatement($AST); - if (!count($this->translatedComponents)) { + if ([] === $this->translatedComponents) { return $result; } diff --git a/src/Translatable/TranslatableListener.php b/src/Translatable/TranslatableListener.php index 4b5a703acc..60393e794c 100644 --- a/src/Translatable/TranslatableListener.php +++ b/src/Translatable/TranslatableListener.php @@ -362,7 +362,7 @@ public function getTranslatableLocale($object, $meta, $om = null) } } elseif ($om instanceof DocumentManager) { [$mapping, $parentObject] = $om->getUnitOfWork()->getParentAssociation($object); - if (null != $parentObject) { + if (null !== $parentObject) { $parentMeta = $om->getClassMetadata(get_class($parentObject)); $locale = $this->getTranslatableLocale($parentObject, $parentMeta, $om); } @@ -441,6 +441,7 @@ public function onFlush(EventArgs $args) if (isset($config['fields'])) { $wrapped = AbstractWrapper::wrap($object, $om); $transClass = $this->getTranslationClass($ea, $meta->getName()); + \assert($wrapped instanceof AbstractWrapper); $ea->removeAssociatedTranslations($wrapped, $transClass, $config['useObjectClass']); } } @@ -459,7 +460,7 @@ public function postPersist(EventArgs $args) $object = $ea->getObject(); $meta = $om->getClassMetadata(get_class($object)); // check if entity is tracked by translatable and without foreign key - if ($this->getConfiguration($om, $meta->getName()) && count($this->pendingTranslationInserts)) { + if ($this->getConfiguration($om, $meta->getName()) && [] !== $this->pendingTranslationInserts) { $oid = spl_object_id($object); if (array_key_exists($oid, $this->pendingTranslationInserts)) { // load the pending translations without key @@ -679,6 +680,8 @@ private function handleTranslatableObjectUpdate(TranslatableAdapter $ea, object // check if translation already is created if (!$isInsert && !$translation) { + \assert($wrapped instanceof AbstractWrapper); + $translation = $ea->findTranslation( $wrapped, $locale, diff --git a/src/Tree/Entity/Repository/ClosureTreeRepository.php b/src/Tree/Entity/Repository/ClosureTreeRepository.php index c6dd13821b..28905690d4 100644 --- a/src/Tree/Entity/Repository/ClosureTreeRepository.php +++ b/src/Tree/Entity/Repository/ClosureTreeRepository.php @@ -319,7 +319,7 @@ public function buildTreeArray(array $nodes) $levelProp = $hasLevelProp ? $config['level'] : self::SUBQUERY_LEVEL; $childrenIndex = $this->repoUtils->getChildrenIndex(); - if (count($nodes) > 0) { + if ([] !== $nodes) { $firstLevel = $hasLevelProp ? $nodes[0][0]['descendant'][$levelProp] : $nodes[0][$levelProp]; $l = 1; // 1 is only an initial value. We could have a tree which has a root node with any level (subtrees) $refs = []; @@ -517,7 +517,7 @@ public function rebuildClosure() $entries = $q->getScalarResult(); $insertClosures($entries); $newClosuresCount += count($entries); - } while (count($entries) > 0); + } while ([] !== $entries); return $newClosuresCount; }; @@ -611,7 +611,7 @@ public function updateLevelValues() } $this->_em->getConnection()->commit(); $levelUpdatesCount += count($entries); - } while (count($entries) > 0); + } while ([] !== $entries); } return $levelUpdatesCount; diff --git a/src/Tree/Entity/Repository/NestedTreeRepository.php b/src/Tree/Entity/Repository/NestedTreeRepository.php index 1c85af0821..dd524a2cdb 100644 --- a/src/Tree/Entity/Repository/NestedTreeRepository.php +++ b/src/Tree/Entity/Repository/NestedTreeRepository.php @@ -521,7 +521,7 @@ public function getPrevSiblingsQueryBuilder($node, $includeSelf = false) $wrappedParent = new EntityWrapper($parent, $this->_em); $qb->andWhere($qb->expr()->eq('node.'.$config['parent'], ':pid')); $qb->setParameter('pid', $wrappedParent->getIdentifier()); - } elseif (isset($config['root']) && !$parent) { + } elseif (isset($config['root'])) { $qb->andWhere($qb->expr()->eq('node.'.$config['root'], ':root')); $qb->andWhere($qb->expr()->isNull('node.'.$config['parent'])); $method = $config['rootIdentifierMethod']; @@ -978,7 +978,7 @@ private function verifyTree(array &$errors, ?object $root = null): void $qb->setParameter('rid', $rootId); } $nodes = $qb->getQuery()->getArrayResult(); - if (count($nodes)) { + if ([] !== $nodes) { foreach ($nodes as $node) { $errors[] = "node [{$node[$identifier]}] has missing parent".($root ? ' on tree root: '.$rootId : ''); } @@ -998,9 +998,9 @@ private function verifyTree(array &$errors, ?object $root = null): void $result = $qb->getQuery() ->setMaxResults(1) ->getResult(Query::HYDRATE_ARRAY); - $node = count($result) ? array_shift($result) : null; + $node = [] !== $result ? array_shift($result) : []; - if ($node) { + if ([] !== $node) { $id = $node[$identifier]; $errors[] = "node [{$id}], left is greater than right".($root ? ' on tree root: '.$rootId : ''); } diff --git a/src/Tree/Hydrator/ORM/TreeObjectHydrator.php b/src/Tree/Hydrator/ORM/TreeObjectHydrator.php index 98f53c7c39..670899d2fc 100644 --- a/src/Tree/Hydrator/ORM/TreeObjectHydrator.php +++ b/src/Tree/Hydrator/ORM/TreeObjectHydrator.php @@ -66,7 +66,7 @@ protected function hydrateAllData() { $data = parent::hydrateAllData(); - if (0 === count($data)) { + if ([] === $data) { return $data; } diff --git a/src/Tree/RepositoryUtils.php b/src/Tree/RepositoryUtils.php index 9155a1b1bb..0fda8c4713 100644 --- a/src/Tree/RepositoryUtils.php +++ b/src/Tree/RepositoryUtils.php @@ -9,6 +9,8 @@ namespace Gedmo\Tree; +use Doctrine\ODM\MongoDB\DocumentManager; +use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\Mapping\ClassMetadata; use Doctrine\Persistence\ObjectManager; use Gedmo\Exception\InvalidArgumentException; @@ -26,7 +28,7 @@ class RepositoryUtils implements RepositoryUtilsInterface /** @var TreeListener */ protected $listener; - /** @var ObjectManager */ + /** @var ObjectManager&(DocumentManager|EntityManagerInterface) */ protected $om; /** @var RepositoryInterface */ @@ -41,6 +43,7 @@ class RepositoryUtils implements RepositoryUtilsInterface protected $childrenIndex = '__children'; /** + * @param ObjectManager&(DocumentManager|EntityManagerInterface) $om * @param TreeListener $listener * @param RepositoryInterface $repo */ @@ -114,7 +117,7 @@ public function buildTree(array $nodes, array $options = []) return $nestedTree; } - if (!count($nestedTree)) { + if ([] === $nestedTree) { return ''; } @@ -125,7 +128,7 @@ public function buildTree(array $nodes, array $options = []) foreach ($tree as $node) { $output .= is_string($options['childOpen']) ? $options['childOpen'] : $options['childOpen']($node); $output .= $options['nodeDecorator']($node); - if (count($node[$childrenIndex]) > 0) { + if ([] !== $node[$childrenIndex]) { $output .= $build($node[$childrenIndex]); } $output .= is_string($options['childClose']) ? $options['childClose'] : $options['childClose']($node); @@ -144,7 +147,7 @@ public function buildTreeArray(array $nodes) $nestedTree = []; $l = 0; - if (count($nodes) > 0) { + if ([] !== $nodes) { // Node Stack. Used to help building the hierarchy $stack = []; foreach ($nodes as $child) { diff --git a/src/Tree/Strategy/ORM/Closure.php b/src/Tree/Strategy/ORM/Closure.php index c133a1167c..2e62cfb19f 100644 --- a/src/Tree/Strategy/ORM/Closure.php +++ b/src/Tree/Strategy/ORM/Closure.php @@ -244,6 +244,7 @@ public function processScheduledDelete($em, $entity) public function processPostUpdate($em, $entity, AdapterInterface $ea) { + \assert($em instanceof EntityManagerInterface); $meta = $em->getClassMetadata(get_class($entity)); $config = $this->listener->getConfiguration($em, $meta->getName()); diff --git a/src/Uploadable/Event/UploadableBaseEventArgs.php b/src/Uploadable/Event/UploadableBaseEventArgs.php index e80b2942c9..44d65ec49f 100644 --- a/src/Uploadable/Event/UploadableBaseEventArgs.php +++ b/src/Uploadable/Event/UploadableBaseEventArgs.php @@ -51,6 +51,8 @@ abstract class UploadableBaseEventArgs extends EventArgs /** * The configuration of the Uploadable extension for this entity class * + * @todo Check if this property must be removed, as it is never set. + * * @var array */ private $extensionConfiguration; diff --git a/src/Uploadable/UploadableListener.php b/src/Uploadable/UploadableListener.php index ed85ee1f78..749033428a 100644 --- a/src/Uploadable/UploadableListener.php +++ b/src/Uploadable/UploadableListener.php @@ -11,6 +11,7 @@ use Doctrine\Common\EventArgs; use Doctrine\DBAL\Types\Type; +use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\Event\LoadClassMetadataEventArgs; use Doctrine\Persistence\Mapping\ClassMetadata; use Doctrine\Persistence\NotifyPropertyChanged; @@ -219,6 +220,7 @@ public function processFile(AdapterInterface $ea, $object, $action) { $oid = spl_object_id($object); $om = $ea->getObjectManager(); + \assert($om instanceof EntityManagerInterface); $uow = $om->getUnitOfWork(); $meta = $om->getClassMetadata(get_class($object)); $config = $this->getConfiguration($om, $meta->getName()); @@ -576,8 +578,10 @@ public function getDefaultFileInfoClass() /** * Adds a FileInfoInterface object for the given entity * - * @param object $entity - * @param array|FileInfoInterface $fileInfo + * @param object $entity + * @param array|FileInfoInterface|mixed $fileInfo + * + * @phpstan-assert FileInfoInterface|array $fileInfo * * @throws \RuntimeException * diff --git a/tests/Gedmo/Tool/BaseTestCaseORM.php b/tests/Gedmo/Tool/BaseTestCaseORM.php index ce310103a5..1a2dad8ef3 100644 --- a/tests/Gedmo/Tool/BaseTestCaseORM.php +++ b/tests/Gedmo/Tool/BaseTestCaseORM.php @@ -94,8 +94,8 @@ protected function getDefaultMockSqliteEntityManager(EventManager $evm = null, C */ protected function startQueryLog(): void { - if (null === $this->em || null === $this->em->getConnection()->getDatabasePlatform()) { - throw new \RuntimeException('EntityManager and database platform must be initialized'); + if (null === $this->em) { + throw new \RuntimeException('EntityManager must be initialized.'); } $this->queryAnalyzer = new QueryAnalyzer($this->em->getConnection()->getDatabasePlatform()); $this->em->getConfiguration()->setSQLLogger($this->queryAnalyzer);