Le contrôleur
Pour créer un contrôleur, on utilise le maker :
php bin/console make:controller Spam
Un contrôleur SpamController est alors créé dans le dossier src/Controller.
On peut renommer la méthode index en check par exemple, et adapter la route :
class SpamController extends AbstractController
{
#[Route('/api/check', name: 'app_spam_check', methods: "POST")]
public function check(Request $request): JsonResponse
{
}
}
La route
La route répondra derrière l'URI /api/check. La méthode HTTP utilisée est POST, afin de pouvoir recevoir l'email à vérifier dans le corps de la requête.
On pourra alors utiliser Postman par exemple, pour tester l'API, en forgeant une requête manuellement depuis son interface.
Le contrôleur
La méthode check, elle, contient le type-hint Request issu du composant HttpFoundation. Symfony nous fournira alors la requête, à partir de laquelle nous pourrons retrouver l'email à vérifier (dans le corps).
Le type de retour est un peu plus précis que d'habitude : nous réceptionnons une requête et renvoyons une réponse, mais dans le cadre d'une API, nous indiquons le type JsonResponse.
Implémentation
Extraction du corps de la requête
Pour extraire l'email depuis la requête, nous pouvons utiliser la méthode toArray() : elle extrait le contenu du body et le transforme en tableau. On peut alors extraire l'email reçu :
$data = $request->toArray();
$email = $data['email'];
Validation du format de l'email
Pour valider le format de l'email, nous pourrions utiliser la fonction filter_var de la SPL.
Mais le composant Validator de Symfony, concernant les emails, utilise un package : egulias/email-validator. Nous pouvons alors l'ajouter aux dépendances de notre projet :
composer require egulias/email-validator
Pour valider le bon format de l'email, d'autres possibilités pourraient être explorées : installation du validator de Symfony par exemple
Vérification de l'email
Pour vérifier si un email est un spam ou non, nous décidons, pour commencer, de définir un tableau statique.
On peut alors le déclarer en tant que constante privée, au sein de la classe de contrôleur :
class SpamController extends AbstractController
{
private const SPAM_DOMAINS = ["test.com", "mailinator.com", "youpi.net"];
//...
}
Enfin, dans le contrôleur, on peut alors vérifier si le domaine de l'email se trouve dans le tableau avec la méthode in_array de la SPL.
Renvoi de la réponse
Pour renvoyer une réponse au format JSON, la classe AbstractController nous offre une méthode utilitaire : json.
Cette méthode vérifie dans un premier temps la présence du composant serializer, qui permet d'assurer le transfert d'une donnée de PHP à un format défini (JSON, XML, CSV...), et vice-versa. Étant donné que nous avons installé notre application en mode API, nous ne disposons pas de ce composant.
Ainsi, la méthode retombe sur un json_encode de la SPL.
Dans le contrôleur, nous n'avons pas à nous soucier de ce détail d'implémentation. Nous consommons la méthode json en lui passant la donnée à renvoyer au bon format :
if (in_array($domain, self::SPAM_DOMAINS)) {
return $this->json(['result' => 'spam']);
}
return $this->json(['result' => 'ok']);