diff --git a/index.md b/index.md index 35c7a794e936e35087872916368f3111ce238421..0679bfbcb25d9778d855fbbb9c5e9ab8a8f79f94 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