Skip to content
Snippets Groups Projects
Commit 51e1d11c authored by Maxime Veber's avatar Maxime Veber
Browse files

Started real slides :D :D :D :D

parent 1f2e65dd
Branches
No related tags found
No related merge requests found
# 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
💩
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment