Dans cette procédure, je vais vous expliquer comment créer un endpoint personnaliser avec Api Platform et Symfony 6. Api Platform fournis dans un premier temps des endpoints préconstruit mais parfois on a besoin de réaliser un endpoint qui va réaliser des actions particulières, c’est ce que je vais vous montrer dans cette procédure.
Prérequis :
Créer un endpoint personnaliser avec Api Platform :
Dans un premier temps pour créer un endpoint custom, nous allons utiliser une entité que nous avons déjà créer.
Puis nous allons créer notre action personnalisé (l’éxécution du code qui va se trouver dans l’endpoint personnalisé).
Pour ce faire, nous allons créer un sous-dossier dans le repertoire src/Controller qui va contenir toutes actions personnalisés pour nôtre entité et qui seront utilisé par l’API.
mkdir -p src/Controller/User
Ensuite on va créer le fichier qui va contenir l’action personnalisé de notre endpoint dans le dossier précédemment créer.
Cette classe devra être étendue de l’AbstractController et devra contenir le code dans la méthode __invoke comme ci-dessous :
<?php
namespace App\Controller\User;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Attribute\AsController;
#[AsController]
class GetCurrentUserController extends AbstractController
{
public function __invoke(): User
{
return $this->getUser();
}
}
Ensuite nous allons ajouter cette entité dans notre API avec Api Platform :
<?php
namespace App\Entity;
use App\Repository\UserRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\GetCollection;
use Symfony\Component\Serializer\Annotation\Groups;
use App\Controller\User\GetCurrentUserController;
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ApiResource(
formats: ['json'],
normalizationContext: ['groups' => ['user:read']],
denormalizationContext: ['groups' => ['user:write']],
security: 'is_granted("ROLE_USER")',
operations: [
new GetCollection(
name: 'current_user_get',
uriTemplate: '/users/me',
controller: GetCurrentUserController::class,
securityMessage: 'Only authenticated users can access this resource.',
),
],
)]
Dans la déclaration de l’endpoint, nous avons ajouté l’option controller qui contient le controlleur que nous avons précédement créé.
Source :
https://api-platform.com/docs/core/controllers/#creating-custom-operations-and-controllers