Skip to content

Commit 96a4120

Browse files
authored
Merge pull request #611 from api-platform/quality
Fix some Scrutinizer issues
2 parents f1cbd32 + 13899d8 commit 96a4120

File tree

17 files changed

+92
-86
lines changed

17 files changed

+92
-86
lines changed

src/Bridge/Doctrine/Orm/Filter/SearchFilter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,11 @@ public function getDescription(string $resourceClass) : array
294294
];
295295
}
296296
} elseif ($metadata->hasAssociation($field)) {
297-
$association = $field;
298297
$filterParameterNames = [
299298
$property,
300299
$property.'[]',
301300
];
301+
302302
foreach ($filterParameterNames as $filterParameterName) {
303303
$description[$filterParameterName] = [
304304
'property' => $property,

src/Bridge/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactory.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use ApiPlatform\Core\Metadata\Property\Factory\PropertyMetadataFactoryInterface;
1515
use ApiPlatform\Core\Metadata\Property\PropertyMetadata;
1616
use Doctrine\Common\Persistence\ManagerRegistry;
17+
use Doctrine\ORM\Mapping\ClassMetadataInfo;
1718

1819
/**
1920
* Use Doctrine metadata to populate the identifier property.
@@ -56,7 +57,13 @@ public function create(string $resourceClass, string $property, array $options =
5657
foreach ($identifiers as $identifier) {
5758
if ($identifier === $property) {
5859
$propertyMetadata = $propertyMetadata->withIdentifier(true);
59-
$propertyMetadata = $propertyMetadata->withWritable($doctrineClassMetadata->isIdentifierNatural());
60+
if ($doctrineClassMetadata instanceof ClassMetadataInfo) {
61+
$writable = $doctrineClassMetadata->isIdentifierNatural();
62+
} else {
63+
$writable = false;
64+
}
65+
66+
$propertyMetadata = $propertyMetadata->withWritable($writable);
6067

6168
break;
6269
}

src/Bridge/Doctrine/Orm/Util/QueryChecker.php

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,7 @@ public static function hasHavingClause(QueryBuilder $queryBuilder) : bool
4444
*/
4545
public static function hasRootEntityWithForeignKeyIdentifier(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry) : bool
4646
{
47-
foreach ($queryBuilder->getRootEntities() as $rootEntity) {
48-
$rootMetadata = $managerRegistry
49-
->getManagerForClass($rootEntity)
50-
->getClassMetadata($rootEntity);
51-
52-
if ($rootMetadata->containsForeignIdentifier) {
53-
return true;
54-
}
55-
}
56-
57-
return false;
47+
return self::hasRootEntityWithIdentifier($queryBuilder, $managerRegistry, true);
5848
}
5949

6050
/**
@@ -66,13 +56,27 @@ public static function hasRootEntityWithForeignKeyIdentifier(QueryBuilder $query
6656
* @return bool
6757
*/
6858
public static function hasRootEntityWithCompositeIdentifier(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry) : bool
59+
{
60+
return self::hasRootEntityWithIdentifier($queryBuilder, $managerRegistry, false);
61+
}
62+
63+
/**
64+
* Detects if the root entity has the given identifier.
65+
*
66+
* @param QueryBuilder $queryBuilder
67+
* @param ManagerRegistry $managerRegistry
68+
* @param bool $isForeign
69+
*
70+
* @return bool
71+
*/
72+
private static function hasRootEntityWithIdentifier(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry, bool $isForeign) : bool
6973
{
7074
foreach ($queryBuilder->getRootEntities() as $rootEntity) {
7175
$rootMetadata = $managerRegistry
7276
->getManagerForClass($rootEntity)
7377
->getClassMetadata($rootEntity);
7478

75-
if ($rootMetadata->isIdentifierComposite) {
79+
if ($isForeign ? $rootMetadata->isIdentifierComposite : $rootMetadata->containsForeignIdentifier) {
7680
return true;
7781
}
7882
}

src/Bridge/Doctrine/Orm/Util/QueryNameGenerator.php

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ abstract class QueryNameGenerator
3232
*
3333
* @return string
3434
*/
35-
public static function generateJoinAlias($association)
35+
public static function generateJoinAlias(string $association) : string
3636
{
3737
return sprintf('%s_%s', $association, uniqid());
3838
}
@@ -44,7 +44,7 @@ public static function generateJoinAlias($association)
4444
*
4545
* @return string
4646
*/
47-
public static function generateParameterName($name)
47+
public static function generateParameterName(string $name) : string
4848
{
4949
return sprintf('%s_%s', $name, uniqid());
5050
}
@@ -58,11 +58,8 @@ public static function generateParameterName($name)
5858
*
5959
* @return ClassMetadata
6060
*/
61-
public static function getClassMetadataFromJoinAlias(
62-
$alias,
63-
QueryBuilder $queryBuilder,
64-
ManagerRegistry $managerRegistry
65-
) {
61+
public static function getClassMetadataFromJoinAlias(string $alias, QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry) : ClassMetadata
62+
{
6663
$rootEntities = $queryBuilder->getRootEntities();
6764
$rootAliases = $queryBuilder->getRootAliases();
6865

@@ -127,7 +124,7 @@ public static function getClassMetadataFromJoinAlias(
127124
*
128125
* @return string
129126
*/
130-
public static function getJoinRelationship(Join $join)
127+
public static function getJoinRelationship(Join $join) : string
131128
{
132129
static $relationshipProperty = null;
133130
static $initialized = false;
@@ -149,7 +146,7 @@ public static function getJoinRelationship(Join $join)
149146
*
150147
* @return string
151148
*/
152-
public static function getJoinAlias(Join $join)
149+
public static function getJoinAlias(Join $join) : string
153150
{
154151
static $aliasProperty = null;
155152
static $initialized = false;
@@ -171,7 +168,7 @@ public static function getJoinAlias(Join $join)
171168
*
172169
* @return string[]
173170
*/
174-
public static function getOrderByParts(OrderBy $orderBy)
171+
public static function getOrderByParts(OrderBy $orderBy) : array
175172
{
176173
static $partsProperty = null;
177174
static $initialized = false;

src/Bridge/FosUser/EventListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function onKernelView(GetResponseForControllerResultEvent $event)
5252
break;
5353

5454
default:
55-
$this->userManager->updateUser($user, false);
55+
$this->userManager->updateUser($user);
5656
break;
5757
}
5858
}

src/Bridge/NelmioApiDoc/Extractor/AnnotationsProvider/ApiPlatformProvider.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use ApiPlatform\Core\Api\FilterCollection;
1515
use ApiPlatform\Core\Bridge\NelmioApiDoc\Parser\ApiPlatformParser;
1616
use ApiPlatform\Core\Bridge\Symfony\Routing\OperationMethodResolverInterface;
17+
use ApiPlatform\Core\Documentation\Documentation;
1718
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
1819
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface;
1920
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
@@ -50,22 +51,31 @@ public function __construct(ResourceNameCollectionFactoryInterface $resourceName
5051
*/
5152
public function getAnnotations() : array
5253
{
53-
$annotations = [];
54-
$hydraDoc = $this->documentationNormalizer->normalize($this->resourceNameCollectionFactory->create());
54+
$hydraDoc = $this->documentationNormalizer->normalize(new Documentation($this->resourceNameCollectionFactory->create()));
5555
$entrypointHydraDoc = $this->getResourceHydraDoc($hydraDoc, '#Entrypoint');
5656

57+
if (empty($hydraDoc) || null === $entrypointHydraDoc) {
58+
return [];
59+
}
60+
61+
$annotations = [];
5762
foreach ($this->resourceNameCollectionFactory->create() as $resourceClass) {
5863
$resourceMetadata = $this->resourceMetadataFactory->create($resourceClass);
5964

6065
$prefixedShortName = ($iri = $resourceMetadata->getIri()) ? $iri : '#'.$resourceMetadata->getShortName();
6166
$resourceHydraDoc = $this->getResourceHydraDoc($hydraDoc, $prefixedShortName);
67+
if (null === $resourceHydraDoc) {
68+
continue;
69+
}
6270

63-
if ($hydraDoc) {
64-
foreach ($resourceMetadata->getCollectionOperations() as $operationName => $operation) {
71+
if (null !== $collectionOperations = $resourceMetadata->getCollectionOperations()) {
72+
foreach ($collectionOperations as $operationName => $operation) {
6573
$annotations[] = $this->getApiDoc(true, $resourceClass, $resourceMetadata, $operationName, $resourceHydraDoc, $entrypointHydraDoc);
6674
}
75+
}
6776

68-
foreach ($resourceMetadata->getItemOperations() as $operationName => $operation) {
77+
if (null !== $itemOperations = $resourceMetadata->getItemOperations()) {
78+
foreach ($itemOperations as $operationName => $operation) {
6979
$annotations[] = $this->getApiDoc(false, $resourceClass, $resourceMetadata, $operationName, $resourceHydraDoc);
7080
}
7181
}

src/Bridge/NelmioApiDoc/Parser/ApiPlatformParser.php

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public function parse(array $item) : array
8282
list($io, $resourceClass, $operationName) = explode(':', $item['class'], 3);
8383
$resourceMetadata = $this->resourceMetadataFactory->create($resourceClass);
8484

85-
$classOperations = $this->getGroupsForItemAndCollectionOperation($resourceMetadata, $resourceClass, $io, $operationName);
85+
$classOperations = $this->getGroupsForItemAndCollectionOperation($resourceMetadata, $resourceClass, $operationName);
8686
if (!empty($classOperations['serializer_groups'])) {
8787
return $this->getPropertyMetadata($resourceMetadata, $resourceClass, $io, [], $classOperations);
8888
}
@@ -123,26 +123,27 @@ private function parseResource(ResourceMetadata $resourceMetadata, string $resou
123123
*
124124
* @param ResourceMetadata $resourceMetadata
125125
* @param string $resourceClass
126-
* @param string $io
127126
* @param string[] $visited
128127
*
129128
* @return array
130129
*/
131-
private function getGroupsForItemAndCollectionOperation(ResourceMetadata $resourceMetadata, string $resourceClass, string $io, string $operationName, array $visited = []) : array
130+
private function getGroupsForItemAndCollectionOperation(ResourceMetadata $resourceMetadata, string $resourceClass, string $operationName, array $visited = []) : array
132131
{
133132
$visited[] = $resourceClass;
134133

135-
$options = [];
136-
137-
$operation['denormalization_context'] = array_merge($resourceMetadata->getItemOperationAttribute($operationName, 'denormalization_context', []), $resourceMetadata->getCollectionOperationAttribute($operationName, 'denormalization_context', []));
138-
$operation['normalization_context'] = array_merge($resourceMetadata->getItemOperationAttribute($operationName, 'normalization_context', []), $resourceMetadata->getCollectionOperationAttribute($operationName, 'normalization_context', []));
134+
$operation = [
135+
'denormalization_context' => array_merge($resourceMetadata->getItemOperationAttribute($operationName, 'denormalization_context', []), $resourceMetadata->getCollectionOperationAttribute($operationName, 'denormalization_context', [])),
136+
'normalization_context' => array_merge($resourceMetadata->getItemOperationAttribute($operationName, 'normalization_context', []), $resourceMetadata->getCollectionOperationAttribute($operationName, 'normalization_context', [])),
137+
];
139138

140-
$options['serializer_groups'] = !empty($operation['normalization_context']) ? $operation['normalization_context']['groups'] : [];
139+
$options = [
140+
'serializer_groups' => !empty($operation['normalization_context']) ? $operation['normalization_context']['groups'] : [],
141+
];
141142

142143
$options['serializer_groups'] = array_merge(
143-
$options['serializer_groups'],
144-
!empty($operation['denormalization_context']) ? $operation['denormalization_context']['groups'] : []
145-
);
144+
$options['serializer_groups'],
145+
!empty($operation['denormalization_context']) ? $operation['denormalization_context']['groups'] : []
146+
);
146147

147148
return $options;
148149
}

src/Bridge/Symfony/PropertyInfo/Metadata/Property/PropertyInfoPropertyMetadataFactory.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,16 @@ public function __construct(PropertyInfoExtractorInterface $propertyInfo, Proper
3737
*/
3838
public function create(string $resourceClass, string $name, array $options = []) : PropertyMetadata
3939
{
40-
if (null !== $this->decorated) {
40+
if (null === $this->decorated) {
41+
$propertyMetadata = new PropertyMetadata();
42+
} else {
4143
try {
4244
$propertyMetadata = $this->decorated->create($resourceClass, $name, $options);
4345
} catch (PropertyNotFoundException $propertyNotFoundException) {
4446
$propertyMetadata = new PropertyMetadata();
4547
}
4648
}
49+
4750
if (null === $propertyMetadata->getType()) {
4851
$types = $this->propertyInfo->getTypes($resourceClass, $name, $options);
4952
if (isset($types[0])) {

src/Bridge/Symfony/PropertyInfo/Metadata/Property/PropertyInfoPropertyNameCollectionFactory.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace ApiPlatform\Core\Bridge\Symfony\PropertyInfo\Metadata\Property;
1313

14+
use ApiPlatform\Core\Exception\RuntimeException;
1415
use ApiPlatform\Core\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface;
1516
use ApiPlatform\Core\Metadata\Property\PropertyNameCollection;
1617
use Symfony\Component\PropertyInfo\PropertyInfoExtractorInterface;
@@ -36,6 +37,11 @@ public function __construct(PropertyInfoExtractorInterface $propertyInfo)
3637
*/
3738
public function create(string $resourceClass, array $options = []) : PropertyNameCollection
3839
{
39-
return new PropertyNameCollection($this->propertyInfo->getProperties($resourceClass, $options));
40+
$properties = $this->propertyInfo->getProperties($resourceClass, $options);
41+
if (null === $properties) {
42+
throw new RuntimeException(sprintf('There is no PropertyInfo extractor supporting the class "%s".', $resourceClass));
43+
}
44+
45+
return new PropertyNameCollection($properties);
4046
}
4147
}

src/Bridge/Symfony/Routing/ApiLoader.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,16 @@ public function load($data, $type = null)
6969
throw new InvalidResourceException(sprintf('Resource %s has no short name defined.', $resourceClass));
7070
}
7171

72-
foreach ($resourceMetadata->getCollectionOperations() as $operationName => $operation) {
73-
$this->addRoute($routeCollection, $resourceClass, $operationName, $operation, $resourceShortName, true);
72+
if (null !== $collectionOperations = $resourceMetadata->getCollectionOperations()) {
73+
foreach ($collectionOperations as $operationName => $operation) {
74+
$this->addRoute($routeCollection, $resourceClass, $operationName, $operation, $resourceShortName, true);
75+
}
7476
}
7577

76-
foreach ($resourceMetadata->getItemOperations() as $operationName => $operation) {
77-
$this->addRoute($routeCollection, $resourceClass, $operationName, $operation, $resourceShortName, false);
78+
if (null !== $itemOperations = $resourceMetadata->getItemOperations()) {
79+
foreach ($itemOperations as $operationName => $operation) {
80+
$this->addRoute($routeCollection, $resourceClass, $operationName, $operation, $resourceShortName, false);
81+
}
7882
}
7983
}
8084

0 commit comments

Comments
 (0)