Skip to content

Commit 61e1bb4

Browse files
author
Joe Bennett
authored
Merge branch '2.5' into 3577-content-negotiation-firewall
2 parents 57ac3c3 + db93ef1 commit 61e1bb4

13 files changed

+116
-13
lines changed

phpstan.neon.dist

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ parameters:
88
symfony:
99
container_xml_path: tests/Fixtures/app/var/cache/test/appAppKernelTestDebugContainer.xml
1010
constant_hassers: false
11-
autoload_files:
11+
bootstrapFiles:
1212
- tests/Fixtures/app/AppKernel.php
1313
excludes_analyse:
1414
- tests/Fixtures/app/var/cache
@@ -132,3 +132,10 @@ parameters:
132132
-
133133
message: "#Call to function method_exists\\(\\) with ApiPlatform\\\\Core\\\\JsonApi\\\\Serializer\\\\ItemNormalizer and 'setCircularReferenc…' will always evaluate to false\\.#"
134134
path: tests/JsonApi/Serializer/ItemNormalizerTest.php
135+
136+
# Waiting to be fixed by https://github.com/Roave/BetterReflection/issues/663
137+
-
138+
message: '#Call to private method getNestedFieldPath\(\) of class ApiPlatform\\Core\\Bridge\\Elasticsearch\\DataProvider\\Filter\\AbstractFilter\.#'
139+
paths:
140+
- src/Bridge/Elasticsearch/DataProvider/Filter/OrderFilter.php
141+
- src/Bridge/Elasticsearch/DataProvider/Filter/AbstractSearchFilter.php

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Doctrine\ORM\Query\Expr\Join;
2323
use Doctrine\ORM\QueryBuilder;
2424
use Psr\Log\LoggerInterface;
25+
use Symfony\Component\HttpFoundation\InputBag;
2526
use Symfony\Component\HttpFoundation\Request;
2627
use Symfony\Component\HttpFoundation\RequestStack;
2728
use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
@@ -204,8 +205,13 @@ protected function extractProperties(Request $request/*, string $resourceClass*/
204205

205206
@trigger_error(sprintf('The use of "%s::extractProperties()" is deprecated since 2.2. Use the "filters" key of the context instead.', __CLASS__), E_USER_DEPRECATED);
206207

207-
$properties = $request->query->get($this->existsParameterName);
208+
// symfony > 5.1
209+
if (class_exists(InputBag::class)) {
210+
return $request->query->all($this->existsParameterName);
211+
}
208212

213+
$properties = $request->query->get($this->existsParameterName);
214+
/* @phpstan-ignore-next-line */
209215
return \is_array($properties) ? $properties : [];
210216
}
211217
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Doctrine\ORM\Query\Expr\Join;
2121
use Doctrine\ORM\QueryBuilder;
2222
use Psr\Log\LoggerInterface;
23+
use Symfony\Component\HttpFoundation\InputBag;
2324
use Symfony\Component\HttpFoundation\Request;
2425
use Symfony\Component\HttpFoundation\RequestStack;
2526
use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
@@ -120,8 +121,14 @@ protected function filterProperty(string $property, $direction, QueryBuilder $qu
120121
protected function extractProperties(Request $request/*, string $resourceClass*/): array
121122
{
122123
@trigger_error(sprintf('The use of "%s::extractProperties()" is deprecated since 2.2. Use the "filters" key of the context instead.', __CLASS__), E_USER_DEPRECATED);
123-
$properties = $request->query->get($this->orderParameterName);
124124

125+
// symfony > 5.1
126+
if (class_exists(InputBag::class)) {
127+
return $request->query->all($this->orderParameterName);
128+
}
129+
130+
$properties = $request->query->get($this->orderParameterName);
131+
/* @phpstan-ignore-next-line */
125132
return \is_array($properties) ? $properties : [];
126133
}
127134
}

src/Filter/QueryParameterValidateListener.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
1919
use ApiPlatform\Core\Util\RequestAttributesExtractor;
2020
use Psr\Container\ContainerInterface;
21+
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
22+
use Symfony\Component\HttpFoundation\InputBag;
2123
use Symfony\Component\HttpFoundation\Request;
2224
use Symfony\Component\HttpKernel\Event\RequestEvent;
2325

@@ -94,8 +96,17 @@ private function isRequiredFilterValid(string $name, Request $request): bool
9496
if (\is_array($matches[$rootName])) {
9597
$keyName = array_keys($matches[$rootName])[0];
9698

97-
$queryParameter = $request->query->get($rootName);
99+
// symfony > 5.1
100+
if (class_exists(InputBag::class)) {
101+
try {
102+
return isset($request->query->all($rootName)[$keyName]);
103+
} catch (BadRequestException $e) {
104+
return false;
105+
}
106+
}
98107

108+
$queryParameter = $request->query->get($rootName);
109+
/* @phpstan-ignore-next-line */
99110
return \is_array($queryParameter) && isset($queryParameter[$keyName]);
100111
}
101112

src/GraphQl/Action/EntrypointAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ private function parseRequest(Request $request): array
8989
{
9090
$query = $request->query->get('query');
9191
$operation = $request->query->get('operation');
92-
if ($variables = $request->query->get('variables', [])) {
92+
if ($variables = $request->query->get('variables') ?: []) {
9393
$variables = $this->decodeVariables($variables);
9494
}
9595

src/JsonApi/EventListener/TransformFieldsetsParametersListener.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace ApiPlatform\Core\JsonApi\EventListener;
1515

1616
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
17+
use Symfony\Component\HttpFoundation\InputBag;
1718
use Symfony\Component\HttpKernel\Event\RequestEvent;
1819

1920
/**
@@ -36,17 +37,19 @@ public function onKernelRequest(RequestEvent $event): void
3637
$request = $event->getRequest();
3738

3839
$includeParameter = $request->query->get('include');
40+
$fieldsParameter = class_exists(InputBag::class) ? $request->query->all('fields') : $request->query->get('fields');
41+
3942
if (
4043
'jsonapi' !== $request->getRequestFormat() ||
4144
!($resourceClass = $request->attributes->get('_api_resource_class')) ||
42-
(!($fieldsParameter = $request->query->get('fields')) && !$includeParameter)
45+
(!$fieldsParameter && !$includeParameter)
4346
) {
4447
return;
4548
}
4649

4750
if (
4851
($fieldsParameter && !\is_array($fieldsParameter)) ||
49-
($includeParameter && !\is_string($includeParameter))
52+
(!\is_string($includeParameter))
5053
) {
5154
return;
5255
}

src/JsonApi/EventListener/TransformFilteringParametersListener.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace ApiPlatform\Core\JsonApi\EventListener;
1515

16+
use Symfony\Component\HttpFoundation\InputBag;
1617
use Symfony\Component\HttpKernel\Event\RequestEvent;
1718

1819
/**
@@ -27,13 +28,16 @@ final class TransformFilteringParametersListener
2728
public function onKernelRequest(RequestEvent $event): void
2829
{
2930
$request = $event->getRequest();
31+
$filterParameter = class_exists(InputBag::class) ? $request->query->all('filter') : $request->query->get('filter');
32+
3033
if (
3134
'jsonapi' !== $request->getRequestFormat() ||
32-
null === ($filterParameter = $request->query->get('filter')) ||
33-
!\is_array($filterParameter)
35+
!\is_array($filterParameter) ||
36+
!$filterParameter
3437
) {
3538
return;
3639
}
40+
3741
$filters = $request->attributes->get('_api_filters', []);
3842
$request->attributes->set('_api_filters', array_merge($filterParameter, $filters));
3943
}

src/JsonApi/EventListener/TransformPaginationParametersListener.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ public function onKernelRequest(RequestEvent $event): void
2828
{
2929
$request = $event->getRequest();
3030

31+
$pageParameter = class_exists(InputBag::class) ? $request->query->all('page') : $request->query->get('page');
32+
3133
if (
3234
'jsonapi' !== $request->getRequestFormat() ||
33-
null === ($pageParameter = $request->query->get('page')) ||
3435
!\is_array($pageParameter)
3536
) {
3637
return;

src/JsonApi/EventListener/TransformSortingParametersListener.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,12 @@ public function onKernelRequest(RequestEvent $event): void
3535
{
3636
$request = $event->getRequest();
3737

38+
$orderParameter = $request->query->get('sort');
39+
3840
if (
3941
'jsonapi' !== $request->getRequestFormat() ||
40-
null === ($orderParameter = $request->query->get('sort')) ||
42+
null === $orderParameter ||
43+
/* @phpstan-ignore-next-line */
4144
\is_array($orderParameter)
4245
) {
4346
return;

src/Test/DoctrineMongoDbOdmFilterTestCase.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
use ApiPlatform\Core\Bridge\Doctrine\MongoDbOdm\Filter\FilterInterface;
1717
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Document\Dummy;
18-
use Doctrine\Bundle\MongoDBBundle\Tests\TestCase;
1918
use Doctrine\Common\Persistence\ManagerRegistry;
2019
use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
2120
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
@@ -51,7 +50,7 @@ protected function setUp(): void
5150
{
5251
self::bootKernel();
5352

54-
$manager = TestCase::createTestDocumentManager();
53+
$manager = DoctrineMongoDbOdmTestCase::createTestDocumentManager();
5554
$this->managerRegistry = self::$kernel->getContainer()->get('doctrine_mongodb');
5655
$this->repository = $manager->getRepository(Dummy::class);
5756
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace ApiPlatform\Core\Test;
15+
16+
use Doctrine\Common\Annotations\AnnotationReader;
17+
use Doctrine\Common\Cache\ArrayCache;
18+
use Doctrine\ODM\MongoDB\Configuration;
19+
use Doctrine\ODM\MongoDB\DocumentManager;
20+
use Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver;
21+
use PHPUnit\Framework\TestCase;
22+
use function sys_get_temp_dir;
23+
24+
/**
25+
* Source: https://github.com/doctrine/DoctrineMongoDBBundle/blob/0174003844bc566bb4cb3b7d10c5528d1924d719/Tests/TestCase.php
26+
* Test got excluded from vendor in 4.x.
27+
*/
28+
class DoctrineMongoDbOdmTestCase extends TestCase
29+
{
30+
/**
31+
* @return DocumentManager
32+
*/
33+
public static function createTestDocumentManager($paths = [])
34+
{
35+
$config = new Configuration();
36+
$config->setAutoGenerateProxyClasses(Configuration::AUTOGENERATE_FILE_NOT_EXISTS);
37+
$config->setProxyDir(sys_get_temp_dir());
38+
$config->setHydratorDir(sys_get_temp_dir());
39+
$config->setProxyNamespace('SymfonyTests\Doctrine');
40+
$config->setHydratorNamespace('SymfonyTests\Doctrine');
41+
$config->setMetadataDriverImpl(new AnnotationDriver(new AnnotationReader(), $paths));
42+
$config->setMetadataCacheImpl(new ArrayCache());
43+
44+
return DocumentManager::create(null, $config);
45+
}
46+
}

tests/JsonApi/EventListener/TransformFieldsetsParametersListenerTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
1919
use ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\Dummy;
2020
use PHPUnit\Framework\TestCase;
21+
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
22+
use Symfony\Component\HttpFoundation\InputBag;
2123
use Symfony\Component\HttpFoundation\Request;
2224
use Symfony\Component\HttpKernel\Event\RequestEvent;
2325

@@ -50,6 +52,10 @@ public function testOnKernelRequestWithInvalidFormat()
5052

5153
public function testOnKernelRequestWithInvalidFilter()
5254
{
55+
if (class_exists(InputBag::class)) {
56+
$this->expectException(BadRequestException::class);
57+
}
58+
5359
$eventProphecy = $this->prophesize(RequestEvent::class);
5460

5561
$expectedRequest = new Request();
@@ -127,6 +133,10 @@ public function testOnKernelRequestWithIncludeWithoutFields()
127133

128134
public function testOnKernelRequestWithWrongParametersTypesDoesnTAffectRequestAttributes()
129135
{
136+
if (class_exists(InputBag::class)) {
137+
$this->expectException(BadRequestException::class);
138+
}
139+
130140
$request = new Request(
131141
['fields' => 'foo', 'include' => ['relatedDummy,foo']],
132142
[],

tests/JsonApi/EventListener/TransformFilteringParametersListenerTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
use ApiPlatform\Core\JsonApi\EventListener\TransformFilteringParametersListener;
1717
use PHPUnit\Framework\TestCase;
18+
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
19+
use Symfony\Component\HttpFoundation\InputBag;
1820
use Symfony\Component\HttpFoundation\Request;
1921
use Symfony\Component\HttpKernel\Event\RequestEvent;
2022

@@ -47,6 +49,10 @@ public function testOnKernelRequestWithInvalidFormat()
4749

4850
public function testOnKernelRequestWithInvalidFilter()
4951
{
52+
if (class_exists(InputBag::class)) {
53+
$this->expectException(BadRequestException::class);
54+
}
55+
5056
$eventProphecy = $this->prophesize(RequestEvent::class);
5157

5258
$expectedRequest = new Request();

0 commit comments

Comments
 (0)