core
core copied to clipboard
Cannot make GET request (Accept: text/html), it's always catched up by the documentation route
API Platform version(s) affected: 2.5.7
Description
I have a resource with only the "get item" activated. It uses a custom controller.
I want it to return either the json serialized resource or a html/twig template depending on the client Accept header/format parameter.
this doesnt work:
curl -X GET "http://127.0.0.1:9007/api/email_verifications/my_token -h "Accept: text/html"
It returns the documentation html page (but autoscrolled at the correct resource location)
How to reproduce
the resource:
<?php
namespace App\Entity\Api;
use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Controller\EmailVerificationController;
/**
* @ApiResource(
* formats={"html", "json", "jsonld"},
* collectionOperations={},
* itemOperations={
* "get"={
* "method"="GET",
* "requirements"={"id"=".+"},
* "controller"=EmailVerificationController::class
* }
* }
* )
*/
class EmailVerification
{
/**
* @var string
* @ApiProperty(identifier=true)
*/
public $token;
public function __construct($token)
{
$this->token = $token;
}
}
the controller :
<?php
namespace App\Controller;
use App\Entity\Api\EmailVerification;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Encoder\JWTEncoderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Twig\Environment;
class EmailVerificationController
{
private $JWTEncoder;
private $em;
private $twig;
public function __construct(JWTEncoderInterface $JWTEncoder, EntityManagerInterface $em, Environment $twig)
{
$this->JWTEncoder = $JWTEncoder;
$this->em = $em;
$this->twig = $twig;
}
public function __invoke(EmailVerification $data, Request $request)
{
try {
$data = $this->JWTEncoder->decode($data->token);
} catch( \Exception $e ) {
return new Response("", 400);
}
/** @var User $user */
if( isset($data['user_id']) && ($user = $this->em->getRepository(User::class)->find($data['user_id'])) ) {
$user->setEmailVerificationRequired(false);
$this->em->flush();
if (in_array('text/html', $request->getAcceptableContentTypes())) {
return new Response($this->twig->render('transactions/email_verification.html.twig'));
}
return new Response("", 200);
} else {
return new Response("", 400);
}
}
}
Additional Context
api_platform:
mapping:
paths: ['%kernel.project_dir%/src/Entity']
patch_formats:
json: ['application/merge-patch+json']
swagger:
versions: [3]
api_keys:
apiKey:
name: Authorization
type: header
name_converter: 'Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter'
formats:
jsonld: ['application/ld+json']
json: ['application/json']
csv: ['text/csv']
html: ['text/html']