From 66b2c89443410a95ff0eeceb09bdf68b0d8e0f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Paris?= <postmaster@greg0ire.fr> Date: Wed, 28 Feb 2018 23:50:52 +0100 Subject: [PATCH] Add slides about repositories / query functions --- index.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/index.md b/index.md index 35c7a79..0679bfb 100644 --- a/index.md +++ b/index.md @@ -202,6 +202,63 @@ Note: - On peut faire plusieurs constructeurs nommés - On peut passer le constructeur en privé pour encourager l'utilisation des constructeurs nommés. +--- +### Les repositories + +```php +final class DoctrineArticleRepository implements ArticleRepository +{ + public function __construct(EntityManagerInterface $entityManager) + { + $this->entityManager = $entityManager; + } + + public function latestArticles(int $size): iterable + { + $this->entityManager->createQueryBuilder() + ->select('a.*') + ->from(Article::class) + ->orderBy('a.createdAt', 'DESC') + ->setMaxResults($size) + ->getQuery() + ->getResults(); + } +} +``` + +Note: +- `Repository`, c'est un pattern, et il vaut mieux définir les vôtres sous + forme d'interface. +- Plus l'interface est grosse, plus elle devient difficile à implémenter, et le + code qui consomme l'API a rarement besoin de faire beaucoup d'appels, du +coup… slide suivant + +--- +# Les Query functions + +```php +final class DoctrineGetLatestArticles implements GetLatestArticles +{ + public function __construct(EntityManagerInterface $entityManager) + { + $this->entityManager = $entityManager; + } + + public function __invoke(int $size): iterable + { + $this->entityManager->createQueryBuilder() + ->select('a.*') + ->from(Article::class) + ->orderBy('a.createdAt', 'DESC') + ->setMaxResults($size) + ->getQuery() + ->getResults(); + } +} +``` + +Note: +- Tout de suite beaucoup plus simple à réimplémenter en elasticsearch --- # Emoji test -- GitLab