From 1d8c8b1699735c58e07bb99b760d54f8896a4404 Mon Sep 17 00:00:00 2001 From: aaa2000 Date: Thu, 4 Dec 2025 21:32:15 +0100 Subject: [PATCH 1/5] ci: use php 8.5 --- .github/workflows/ci.yml | 55 ++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 495ea2bc77..f394bc1ed9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false steps: - name: Checkout @@ -57,7 +57,7 @@ jobs: strategy: matrix: php: - - '8.3' + - '8.5' fail-fast: false steps: - name: Checkout @@ -80,7 +80,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false steps: - name: Checkout @@ -117,7 +117,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false env: APP_DEBUG: '1' # https://github.com/phpstan/phpstan-symfony/issues/37 @@ -186,10 +186,12 @@ jobs: - '8.2' - '8.3' - '8.4' + - '8.5' include: - php: '8.2' - php: '8.3' - php: '8.4' + - php: '8.5' coverage: true fail-fast: false steps: @@ -257,10 +259,11 @@ jobs: - version: '8.2' - version: '8.3' - version: '8.4' + - version: '8.5' coverage: true - - version: '8.4' + - version: '8.5' lowest: true - - version: '8.4' + - version: '8.5' minimal-changes: true component: - api-platform/doctrine-common @@ -341,7 +344,7 @@ jobs: strategy: matrix: php: - - version: '8.4' + - version: '8.5' component: - api-platform/doctrine-common - api-platform/doctrine-orm @@ -394,10 +397,12 @@ jobs: - '8.2' - '8.3' - '8.4' + - '8.5' include: - php: '8.2' - php: '8.3' - php: '8.4' + - php: '8.5' coverage: true fail-fast: false steps: @@ -472,7 +477,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false env: APP_ENV: postgres @@ -522,7 +527,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false services: mysql: @@ -572,7 +577,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false env: APP_ENV: mongodb @@ -660,7 +665,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false env: APP_ENV: mercure @@ -750,7 +755,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false env: APP_ENV: elasticsearch @@ -802,7 +807,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false env: APP_ENV: elasticsearch @@ -908,7 +913,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false steps: - name: Checkout @@ -947,7 +952,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false steps: - name: Checkout @@ -990,7 +995,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false steps: - name: Checkout @@ -1035,7 +1040,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false env: APP_ENV: sqlite @@ -1132,7 +1137,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false steps: - name: Checkout @@ -1178,9 +1183,9 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' include: - - php: '8.4' + - php: '8.5' coverage: true fail-fast: false steps: @@ -1256,7 +1261,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false steps: - name: Checkout @@ -1304,7 +1309,7 @@ jobs: strategy: matrix: php: - - '8.4' + - '8.5' fail-fast: false steps: - name: Checkout @@ -1355,10 +1360,12 @@ jobs: - '8.2' - '8.3' - '8.4' + - '8.5' include: - php: '8.2' - php: '8.3' - php: '8.4' + - php: '8.5' coverage: true fail-fast: false steps: @@ -1384,7 +1391,7 @@ jobs: working-directory: 'src/Laravel' laravel-e2e: - name: Laravel E2E installation (PHP 8.4) + name: Laravel E2E installation (PHP 8.5) runs-on: ubuntu-latest timeout-minutes: 20 steps: @@ -1393,7 +1400,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: 8.4 + php-version: 8.5 tools: pecl, composer extensions: intl, bcmath, curl, openssl, mbstring, pdo_sqlite, mongodb ini-values: memory_limit=-1 From 90eddbc4836e143bc6f3c98e680a1cc988048d96 Mon Sep 17 00:00:00 2001 From: aaa2000 Date: Thu, 4 Dec 2025 22:32:13 +0100 Subject: [PATCH 2/5] fix PHP8.5 deprecation - Using null as an array offset is deprecated, use an empty string instead --- src/Doctrine/Odm/Filter/ExistsFilter.php | 2 +- src/Doctrine/Odm/Filter/OrderFilter.php | 2 +- src/Doctrine/Orm/Filter/ExistsFilter.php | 2 +- src/Doctrine/Orm/Filter/OrderFilter.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Doctrine/Odm/Filter/ExistsFilter.php b/src/Doctrine/Odm/Filter/ExistsFilter.php index a4f751b3a9..452df1e9d8 100644 --- a/src/Doctrine/Odm/Filter/ExistsFilter.php +++ b/src/Doctrine/Odm/Filter/ExistsFilter.php @@ -129,7 +129,7 @@ public function __construct(?ManagerRegistry $managerRegistry = null, ?LoggerInt public function apply(Builder $aggregationBuilder, string $resourceClass, ?Operation $operation = null, array &$context = []): void { $parameter = $context['parameter'] ?? null; - if (null !== ($value = $context['filters'][$parameter?->getProperty()] ?? null)) { + if (null !== ($value = $context['filters'][$parameter?->getProperty() ?? ''] ?? null)) { $this->filterProperty($this->denormalizePropertyName($parameter->getProperty()), $value, $aggregationBuilder, $resourceClass, $operation, $context); return; diff --git a/src/Doctrine/Odm/Filter/OrderFilter.php b/src/Doctrine/Odm/Filter/OrderFilter.php index 105c3327c9..e3da0a55a5 100644 --- a/src/Doctrine/Odm/Filter/OrderFilter.php +++ b/src/Doctrine/Odm/Filter/OrderFilter.php @@ -239,7 +239,7 @@ public function apply(Builder $aggregationBuilder, string $resourceClass, ?Opera } $parameter = $context['parameter'] ?? null; - if (null !== ($value = $context['filters'][$parameter?->getProperty()] ?? null)) { + if (null !== ($value = $context['filters'][$parameter?->getProperty() ?? ''] ?? null)) { $this->filterProperty($this->denormalizePropertyName($parameter->getProperty()), $value, $aggregationBuilder, $resourceClass, $operation, $context); return; diff --git a/src/Doctrine/Orm/Filter/ExistsFilter.php b/src/Doctrine/Orm/Filter/ExistsFilter.php index 7dbb046630..9423aa77cb 100644 --- a/src/Doctrine/Orm/Filter/ExistsFilter.php +++ b/src/Doctrine/Orm/Filter/ExistsFilter.php @@ -136,7 +136,7 @@ public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $q { $parameter = $context['parameter'] ?? null; - if (null !== ($value = $context['filters'][$parameter?->getProperty()] ?? null)) { + if (null !== ($value = $context['filters'][$parameter?->getProperty() ?? ''] ?? null)) { $this->filterProperty($this->denormalizePropertyName($parameter->getProperty()), $value, $queryBuilder, $queryNameGenerator, $resourceClass, $operation, $context); return; diff --git a/src/Doctrine/Orm/Filter/OrderFilter.php b/src/Doctrine/Orm/Filter/OrderFilter.php index 4962bf26e2..586060b8b7 100644 --- a/src/Doctrine/Orm/Filter/OrderFilter.php +++ b/src/Doctrine/Orm/Filter/OrderFilter.php @@ -238,7 +238,7 @@ public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $q } $parameter = $context['parameter'] ?? null; - if (null !== ($value = $context['filters'][$parameter?->getProperty()] ?? null)) { + if (null !== ($value = $context['filters'][$parameter?->getProperty() ?? ''] ?? null)) { $this->filterProperty($this->denormalizePropertyName($parameter->getProperty()), $value, $queryBuilder, $queryNameGenerator, $resourceClass, $operation, $context); return; From 2ac43811c7b7d8e27c12da8f8a689f18c2b006cc Mon Sep 17 00:00:00 2001 From: aaa2000 Date: Thu, 4 Dec 2025 22:48:58 +0100 Subject: [PATCH 3/5] fix php 8.5 deprecations - Method ReflectionProperty::setAccessible() is deprecated since 8.5, as it has no effect As of PHP 8.1.0, calling this method has no effect; all properties are accessible by default. @see https://www.php.net/manual/en/reflectionproperty.setaccessible.php @see https://wiki.php.net/rfc/deprecations_php_8_5#extreflection_deprecations --- src/Doctrine/Orm/Tests/Extension/PaginationExtensionTest.php | 2 -- src/Hal/Tests/Serializer/ItemNormalizerTest.php | 1 - src/Metadata/Extractor/PhpFileResourceExtractor.php | 1 - 3 files changed, 4 deletions(-) diff --git a/src/Doctrine/Orm/Tests/Extension/PaginationExtensionTest.php b/src/Doctrine/Orm/Tests/Extension/PaginationExtensionTest.php index 2b8bcc5114..73e3c82233 100644 --- a/src/Doctrine/Orm/Tests/Extension/PaginationExtensionTest.php +++ b/src/Doctrine/Orm/Tests/Extension/PaginationExtensionTest.php @@ -387,7 +387,6 @@ public function testGetResultWithFetchJoinCollection(bool $paginationFetchJoinCo $this->assertInstanceOf(PaginatorInterface::class, $result); $doctrinePaginatorReflectionProperty = new \ReflectionProperty(AbstractPaginator::class, 'paginator'); - $doctrinePaginatorReflectionProperty->setAccessible(true); $doctrinePaginator = $doctrinePaginatorReflectionProperty->getValue($result); $this->assertSame($expected, $doctrinePaginator->getFetchJoinCollection()); @@ -435,7 +434,6 @@ public function testGetResultWithUseOutputWalkers(bool $paginationUseOutputWalke $this->assertInstanceOf(PaginatorInterface::class, $result); $doctrinePaginatorReflectionProperty = new \ReflectionProperty(AbstractPaginator::class, 'paginator'); - $doctrinePaginatorReflectionProperty->setAccessible(true); $doctrinePaginator = $doctrinePaginatorReflectionProperty->getValue($result); $this->assertSame($expected, $doctrinePaginator->getUseOutputWalkers()); diff --git a/src/Hal/Tests/Serializer/ItemNormalizerTest.php b/src/Hal/Tests/Serializer/ItemNormalizerTest.php index c576e962df..30ce423543 100644 --- a/src/Hal/Tests/Serializer/ItemNormalizerTest.php +++ b/src/Hal/Tests/Serializer/ItemNormalizerTest.php @@ -295,7 +295,6 @@ public function testMaxDepth(): void { $setId = function (MaxDepthDummy $dummy, int $id): void { $prop = new \ReflectionProperty($dummy, 'id'); - $prop->setAccessible(true); $prop->setValue($dummy, $id); }; diff --git a/src/Metadata/Extractor/PhpFileResourceExtractor.php b/src/Metadata/Extractor/PhpFileResourceExtractor.php index d0a4a0a198..672dd4e020 100644 --- a/src/Metadata/Extractor/PhpFileResourceExtractor.php +++ b/src/Metadata/Extractor/PhpFileResourceExtractor.php @@ -38,7 +38,6 @@ protected function extractPath(string $path): void $resourceReflection = new \ReflectionClass($resource); foreach ($resourceReflection->getProperties() as $property) { - $property->setAccessible(true); $resolvedValue = $this->resolve($property->getValue($resource)); $property->setValue($resource, $resolvedValue); } From cf83f4a453c3964196a48f6e36a0db90a7b2a3bf Mon Sep 17 00:00:00 2001 From: aaa2000 Date: Thu, 4 Dec 2025 23:06:18 +0100 Subject: [PATCH 4/5] fix PHP 8.5 deprecations - fix ArrayObject constructor call ArrayObject::__construct(): Using an object as a backing array for ArrayObject is deprecated, as it allows violating class constraints and invariants --- .../Tests/Factory/OpenApiFactoryTest.php | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/OpenApi/Tests/Factory/OpenApiFactoryTest.php b/src/OpenApi/Tests/Factory/OpenApiFactoryTest.php index e5cbd0d7ea..59441d7948 100644 --- a/src/OpenApi/Tests/Factory/OpenApiFactoryTest.php +++ b/src/OpenApi/Tests/Factory/OpenApiFactoryTest.php @@ -695,10 +695,10 @@ public function testInvoke(): void ['Dummy'], [ '200' => new Response('Dummy collection', new \ArrayObject([ - 'application/ld+json' => new MediaType(new \ArrayObject(new \ArrayObject([ + 'application/ld+json' => new MediaType(new \ArrayObject([ 'type' => 'array', 'items' => ['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld'], - ]))), + ])), ])), ], 'Retrieves the collection of Dummy resources.', @@ -727,7 +727,7 @@ public function testInvoke(): void '201' => new Response( 'Dummy resource created', new \ArrayObject([ - 'application/ld+json' => new MediaType(new \ArrayObject(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld']))), + 'application/ld+json' => new MediaType(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld'])), ]), null, new \ArrayObject(['getDummyItem' => new Model\Link('getDummyItem', new \ArrayObject(['id' => '$response.body#/id']), null, 'This is a dummy')]) @@ -750,7 +750,7 @@ public function testInvoke(): void new RequestBody( 'The new Dummy resource', new \ArrayObject([ - 'application/ld+json' => new MediaType(new \ArrayObject(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.jsonld']))), + 'application/ld+json' => new MediaType(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.jsonld'])), ]), true ) @@ -769,7 +769,7 @@ public function testInvoke(): void '200' => new Response( 'Dummy resource', new \ArrayObject([ - 'application/ld+json' => new MediaType(new \ArrayObject(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld']))), + 'application/ld+json' => new MediaType(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld'])), ]) ), '404' => new Response( @@ -1022,7 +1022,7 @@ public function testInvoke(): void '201' => new Response( 'Dummy resource created', new \ArrayObject([ - 'application/ld+json' => new MediaType(new \ArrayObject(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld']))), + 'application/ld+json' => new MediaType(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld'])), ]), null, new \ArrayObject(['getDummyItem' => new Model\Link('getDummyItem', new \ArrayObject(['id' => '$response.body#/id']), null, 'This is a dummy')]) @@ -1073,7 +1073,7 @@ public function testInvoke(): void '201' => new Response( 'Dummy resource created', new \ArrayObject([ - 'application/ld+json' => new MediaType(new \ArrayObject(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld']))), + 'application/ld+json' => new MediaType(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld'])), ]), null, new \ArrayObject(['getDummyItem' => new Model\Link('getDummyItem', new \ArrayObject(['id' => '$response.body#/id']), null, 'This is a dummy')]) @@ -1096,7 +1096,7 @@ public function testInvoke(): void new RequestBody( 'Extended description for the new Dummy resource', new \ArrayObject([ - 'application/ld+json' => new MediaType(new \ArrayObject(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.jsonld']))), + 'application/ld+json' => new MediaType(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.jsonld'])), ]), false ), @@ -1265,7 +1265,7 @@ public function testInvoke(): void '201' => new Response( 'Dummy resource created', new \ArrayObject([ - 'application/ld+json' => new MediaType(new \ArrayObject(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld']))), + 'application/ld+json' => new MediaType(new \ArrayObject(['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld'])), ]), null, new \ArrayObject(['getDummyItem' => new Model\Link('getDummyItem', new \ArrayObject(['id' => '$response.body#/id']), null, 'This is a dummy')]) @@ -1301,17 +1301,17 @@ public function testInvoke(): void ['Dummy'], [ '200' => new Response('Dummy collection', new \ArrayObject([ - 'application/ld+json' => new MediaType(new \ArrayObject(new \ArrayObject([ + 'application/ld+json' => new MediaType(new \ArrayObject([ 'type' => 'array', 'items' => ['$ref' => '#/components/schemas/Dummy.OutputDto.jsonld'], - ]))), + ])), ])), '418' => new Response( 'A Teapot Exception', new \ArrayObject([ - 'application/problem+json' => new MediaType(new \ArrayObject(new \ArrayObject([ + 'application/problem+json' => new MediaType(new \ArrayObject([ '$ref' => '#/components/schemas/DummyErrorResource', - ]))), + ])), ]), links: new \ArrayObject(['getDummyItem' => new Model\Link('getDummyItem', new \ArrayObject(['id' => '$response.body#/id']), null, 'This is a dummy')]) ), From 78dc16c00bfe4d9ebf11a3dcd950a2e2a73e29eb Mon Sep 17 00:00:00 2001 From: aaa2000 Date: Thu, 4 Dec 2025 23:10:16 +0100 Subject: [PATCH 5/5] fix PHP 8.5 deprecations - fix SplObjectStorage Method SplObjectStorage::contains() is deprecated since 8.5, use method SplObjectStorage::offsetExists() instead Method SplObjectStorage::detach() is deprecated since 8.5, use method SplObjectStorage::offsetUnset() instead --- .../EventListener/PublishMercureUpdatesListener.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Doctrine/EventListener/PublishMercureUpdatesListener.php b/src/Symfony/Doctrine/EventListener/PublishMercureUpdatesListener.php index 14763dbe96..902f4c52a0 100644 --- a/src/Symfony/Doctrine/EventListener/PublishMercureUpdatesListener.php +++ b/src/Symfony/Doctrine/EventListener/PublishMercureUpdatesListener.php @@ -129,16 +129,16 @@ public function postFlush(): void try { $creatingObjects = clone $this->createdObjects; foreach ($creatingObjects as $object) { - if ($this->createdObjects->contains($object)) { - $this->createdObjects->detach($object); + if ($this->createdObjects->offsetExists($object)) { + $this->createdObjects->offsetUnset($object); } $this->publishUpdate($object, $creatingObjects[$object], 'create'); } $updatingObjects = clone $this->updatedObjects; foreach ($updatingObjects as $object) { - if ($this->updatedObjects->contains($object)) { - $this->updatedObjects->detach($object); + if ($this->updatedObjects->offsetExists($object)) { + $this->updatedObjects->offsetUnset($object); } $this->publishUpdate($object, $updatingObjects[$object], 'update'); } @@ -146,8 +146,8 @@ public function postFlush(): void $deletingObjects = clone $this->deletedObjects; foreach ($deletingObjects as $object) { $options = $this->deletedObjects[$object]; - if ($this->deletedObjects->contains($object)) { - $this->deletedObjects->detach($object); + if ($this->deletedObjects->offsetExists($object)) { + $this->deletedObjects->offsetUnset($object); } $this->publishUpdate($object, $deletingObjects[$object], 'delete'); }