diff --git a/index.md b/index.md index 50f0bbdd9c4d7bbf530291b95d2ed0e7dbbba24f..8f3dcd7d27ad5bfb79925ace09a59b8e2525882f 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 💩