diff --git a/features/main/patch.feature b/features/main/patch.feature index 8724a0196fc..96ce6653fde 100644 --- a/features/main/patch.feature +++ b/features/main/patch.feature @@ -80,3 +80,14 @@ Feature: Sending PATCH requets "alpha": "/alphas/2" } """ + + Scenario: Patch a non-readable resource + When I add "Content-Type" header equal to "application/merge-patch+json" + And I send a "PATCH" request to "/order_products/1/count" with body: + """ + { + "id": 1, + "count": 10 + } + """ + Then print last JSON response diff --git a/src/Symfony/EventListener/ReadListener.php b/src/Symfony/EventListener/ReadListener.php index a94e93b19f9..375aa18dba5 100644 --- a/src/Symfony/EventListener/ReadListener.php +++ b/src/Symfony/EventListener/ReadListener.php @@ -84,7 +84,9 @@ public function onKernelRequest(RequestEvent $event): void try { $uriVariables = $this->getOperationUriVariables($operation, $request->attributes->all(), $operation->getClass()); } catch (InvalidIdentifierException|InvalidUriVariableException $e) { - throw new NotFoundHttpException('Invalid identifier value or configuration.', $e); + if ($operation->canRead()) { + throw new NotFoundHttpException('Invalid identifier value or configuration.', $e); + } } } diff --git a/tests/Fixtures/TestBundle/ApiResource/Issue6355/OrderDto.php b/tests/Fixtures/TestBundle/ApiResource/Issue6355/OrderDto.php new file mode 100644 index 00000000000..cead79b3381 --- /dev/null +++ b/tests/Fixtures/TestBundle/ApiResource/Issue6355/OrderDto.php @@ -0,0 +1,26 @@ + + * + * 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\Issue6355; + +use ApiPlatform\Metadata\ApiProperty; +use Symfony\Component\Uid\Uuid; + +class OrderDto +{ + #[ApiProperty(identifier: false)] + public ?int $id = null; + + #[ApiProperty(identifier: true)] + public ?Uuid $uuid = null; +} diff --git a/tests/Fixtures/TestBundle/ApiResource/Issue6355/OrderProductCount.php b/tests/Fixtures/TestBundle/ApiResource/Issue6355/OrderProductCount.php new file mode 100644 index 00000000000..ef83f832561 --- /dev/null +++ b/tests/Fixtures/TestBundle/ApiResource/Issue6355/OrderProductCount.php @@ -0,0 +1,44 @@ + + * + * 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\Issue6355; + +use ApiPlatform\Metadata\ApiProperty; +use ApiPlatform\Metadata\ApiResource; +use ApiPlatform\Metadata\NotExposed; +use ApiPlatform\Metadata\Patch; +use ApiPlatform\Tests\Fixtures\TestBundle\Controller\Issue6355\UpdateOrderProductCountController; + +#[ApiResource( + shortName: 'OrderProduct', + operations: [ + new NotExposed(), + new Patch( + uriTemplate: '/order_products/{id}/count', + controller: UpdateOrderProductCountController::class, + class: OrderDto::class, + input: OrderProductCount::class, + output: OrderDto::class, + read: false, + write: false, + name: 'order_product_update_count', + ), + ], + order: ['position' => 'ASC'], +)] +class OrderProductCount +{ + #[ApiProperty(writable: false, identifier: true)] + public ?int $id = null; + public ?int $count = null; +} diff --git a/tests/Fixtures/TestBundle/Controller/Issue6355/UpdateOrderProductCountController.php b/tests/Fixtures/TestBundle/Controller/Issue6355/UpdateOrderProductCountController.php new file mode 100644 index 00000000000..1f96f0390dd --- /dev/null +++ b/tests/Fixtures/TestBundle/Controller/Issue6355/UpdateOrderProductCountController.php @@ -0,0 +1,32 @@ + + * + * 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\Controller\Issue6355; + +use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue6355\OrderDto; +use ApiPlatform\Tests\Fixtures\TestBundle\ApiResource\Issue6355\OrderProductCount; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Attribute\AsController; + +#[AsController] +class UpdateOrderProductCountController extends AbstractController +{ + public function __invoke(OrderProductCount $data, Request $request): OrderDto + { + $dto = new OrderDto(); + $dto->id = 1; + + return $dto; + } +}