api-platform / api-platform/core

[Feature] Content negociation for Custom Action/Controller

Open
#1,423 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
2.6k
Forks
980
Avg merge
2d 5h
Merged PRs (30d)
48

Description

Hi,

It would be great to be able to create Custom Action / Controller not directly linked to any entity but enable the same kind of content negotiation as for the other routes.

For example, if I wants to enable the Content Negotiation request /response listener, I have to add ``defaults={"_api_resource_class"=Foo::class, "_api_collection_operation_name"=""})``:

```php
final class MySpecificAction
{
private $myService;

public function __construct(MyService $myService)
{
$this->myService = $myService;
}

/**
* @Route(name="api_process_things", path="/task/process/things",
* defaults={"_api_resource_class"=Foo::class, "_api_collection_operation_name"=""})
* @Method({"POST"})
*/
public function __invoke()
{
return $this->myService->pocessThings();
}
}
```
Without I need to return a JsonResponse manually if the Accept is application/json (which is not really a problem) but I case the Firewall return an Access Denied (because my role is not allowed to access the route), the response is returned in HTML.

With ``_api_resource_class`` and ``_api_collection_operation_name`` defined, it works but it's hacked because I need to provide an Entity which doesn't correspond to the process and an empty operation_name. It would be better if we could just provide an option to enable the content negotiation. For example ``defaults={"_api_resource_negotiation"=true}``

What do you think about that?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.