From 51e1d11ce6cd17e578c9ec37733e55fbf9795b02 Mon Sep 17 00:00:00 2001
From: "Nek (Maxime Veber)" <nek.dev@gmail.com>
Date: Sat, 24 Feb 2018 19:22:07 +0100
Subject: [PATCH] Started real slides :D :D :D :D

---
 index.md | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 141 insertions(+), 4 deletions(-)

diff --git a/index.md b/index.md
index 50f0bbd..8f3dcd7 100644
--- a/index.md
+++ b/index.md
@@ -1,17 +1,154 @@
-# Hello World
+# Ne soyez plus l'esclave de Doctrine
+
+---
+## Hello!
+
+<div style="width: 50%; float: left;">
+Grégoire Paris
+</div>
+<div style="width: 50%; float: right;">
+Maxime Veber
+</div>
+
+---
+### Une application classique
+
+<pre style="width: 50%; float: left;">
+.
+├── AppBundle
+    ├── Admin
+    ├── AppBundle.php
+    ├── Controller
+    ├── DataFixtures
+    ├── DependencyInjection
+    ├── Entity
+    ├── Form
+    ├── Listeners
+    ├── OAuth
+    ├── Resources
+    ├── Tag
+    └── Twig
+</pre>
+
+---
+### Vous avez dit entité ?
 
 ```php
-<?php
+class TypicalArticle
+{
+    private $id;
+    private $content;
+
+    public function getId() { return $this->id; }
+    public function getContent() { return $this->content; }
+    public function setContent($content)
+    {
+        $this->content = $content;
+        return $this;
+    }
+}
+```
+
+Notes:
+- Pas de validation
+- Pas de règles métier
+- Aucune logique (pas de tests nécessaires)
 
-final class Countdown
+---
+### Nous aimons le DDD
+
+- Séparer le **domaine** de l'infrastructure
+- Représenter les **règles métier** dans les entités
+- Avoir une API expressive
+
+---
+### Doctrine n'a pas besoin de setters
+
+```php
+class NotThatTypicalArticle
 {
-    private $ryan;
+    private $id;
+    private $content;
+
+    public function __construct(string $content)
+    {
+        $this->content = $content;
+    }
+
+    // getters
 }
 ```
 
+Notes:
+- intégrité du domaine
+- Pas de setters par défaut, ni Doctrine ni sf n'en ont besoin
+
 ---
+### Les règles métier
+
+```php
+class Article
+{
+    private $id;
+    private $content;
 
+    public function __construct(string $content)
+    {
+        if (empty($content)) {
+            throw new ArticleHasNoContent();
+        }
+        $this->content = $content;
+    }
 
+    // getters
+}
+```
+
+Note:
+- Impossible de persister une entité invalide
+- Validation compliquée quand on a trop de propriétés
+
+---
+### Les value objects
+
+```php
+class ArticleContent
+{
+    private $content;
+    private $lastModification;
+
+    public function __construct(string $content)
+    {
+        if (empty($content)) {
+            throw new ArticleHasNoContent();
+        }
+        $this->content = $content;
+        $this->lastModification = new \DatetimeImmutable();
+    }
+}
+```
+
+Note:
+- Déportation de la validation dans les value objects
+- Début d'arborescence
+- Doctrine Embeddables
+- Custom types
+
+---
+### Les constructeurs nommés
+
+```php
+class BetterArticle
+{
+    public static function createFromNative(string $content)
+    {
+        return new self(new ArticleContent($content));
+    }
+}
+
+```
+
+---
 # Emoji test
 
 💩
-- 
GitLab