diff --git a/features/jsonld/inheritance.feature b/features/jsonld/inheritance.feature new file mode 100644 index 00000000000..0008392cf54 --- /dev/null +++ b/features/jsonld/inheritance.feature @@ -0,0 +1,12 @@ +Feature: Inheritance with correct IRIs + In order to fix (https://github.com/api-platform/core/issues/5438) + + Scenario: Get the collection of people with its employees + When I add "Accept" header equal to "application/json" + And I send a "GET" request to "/people_5438" + Then print last JSON response + + Scenario: Get the collection of people with its employees + When I add "Accept" header equal to "application/ld+json" + And I send a "GET" request to "/people_5438" + Then print last JSON response diff --git a/src/Serializer/AbstractItemNormalizer.php b/src/Serializer/AbstractItemNormalizer.php index b2d80c1b26c..525ec0702d2 100644 --- a/src/Serializer/AbstractItemNormalizer.php +++ b/src/Serializer/AbstractItemNormalizer.php @@ -116,6 +116,7 @@ public function normalize(mixed $object, string $format = null, array $context = } if (isset($context['operation']) && $context['operation'] instanceof CollectionOperationInterface) { + unset($context['operation_name']); unset($context['operation']); unset($context['iri']); } diff --git a/tests/Fixtures/TestBundle/ApiResource/Issue5438/Contractor.php b/tests/Fixtures/TestBundle/ApiResource/Issue5438/Contractor.php new file mode 100644 index 00000000000..429116390a6 --- /dev/null +++ b/tests/Fixtures/TestBundle/ApiResource/Issue5438/Contractor.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue5438; + +use ApiPlatform\Metadata\Get; +use ApiPlatform\Metadata\Operation; + +#[Get( + shortName: 'Contractor5438', + uriTemplate: 'contractor_5438/{id}', + provider: [Contractor::class, 'getContractor'], +)] +class Contractor extends Person +{ + public static function getContractor(Operation $operation, array $uriVariables = []): self + { + return new self( + $uriVariables['id'], + 'a' + ); + } +} diff --git a/tests/Fixtures/TestBundle/ApiResource/Issue5438/Employee.php b/tests/Fixtures/TestBundle/ApiResource/Issue5438/Employee.php new file mode 100644 index 00000000000..ba56d584e30 --- /dev/null +++ b/tests/Fixtures/TestBundle/ApiResource/Issue5438/Employee.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue5438; + +use ApiPlatform\Metadata\Get; +use ApiPlatform\Metadata\Operation; + +#[Get( + shortName: 'Employee5438', + uriTemplate: 'employee_5438/{id}', + provider: [Employee::class, 'getEmployee'] +)] +class Employee extends Person +{ + public static function getEmployee(Operation $operation, array $uriVariables = []): self + { + return new self( + $uriVariables['id'], + 'a' + ); + } +} diff --git a/tests/Fixtures/TestBundle/ApiResource/Issue5438/Person.php b/tests/Fixtures/TestBundle/ApiResource/Issue5438/Person.php new file mode 100644 index 00000000000..0b11e94d42b --- /dev/null +++ b/tests/Fixtures/TestBundle/ApiResource/Issue5438/Person.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue5438; + +use ApiPlatform\Metadata\GetCollection; +use ApiPlatform\Metadata\Operation; + +#[GetCollection( + shortName: 'People5438', + uriTemplate: 'people_5438', + provider: [Person::class, 'getData'] +)] +abstract class Person +{ + public function __construct(public readonly ?int $id = null, public readonly ?string $name = null) + { + } + + public static function getData(Operation $operation, array $uriVariables = []): iterable + { + return [ + new Contractor( + 1, + 'a' + ), + new Employee( + 2, + 'b' + ), + ]; + } +}