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