DI, Dependency injection, inversion of control, Kezako ?
Mais en fait c'est quoi l'injection de dépendance ?
class Serializer {
public function serialize($data) {
$encoder = new JsonEncoder();
$nameConverter = new CamelCaseToSnakeCaseConverter();
$normalizer = new ObjectNormalizer(nameConverter);
return $encoder->encode($normalizer->normalize($data));
}
}
Ce n'est pas ça...
Et si j'ai besoin d'un autre normalizer/encoder ??
class Serializer {
public function serialize($data) {
$encoder = new XmlEncoder();
$nameConverter = new CamelCaseToSnakeCaseConverter();
$normalizer = new ArrayNormalizer(nameConverter);
return $encoder->encode($normalizer->normalize($data));
}
}
Pas très pratique, mon serializer a besoin de connaitre les implémentations des classes qu'il utilise...
Idéalement mon serializer n'a pas à connaitre les implémentations et se contente de demander des interfaces
L'injection par setter
class Serializer {
private $normalizer;
private $encoder;
public function setEncoder($encoder) {
$this->encoder = $encoder;
}
public function setEncoder($normalizer) {
$this->normalizer = $normalizer;
}
public function serialize($data) {
return $this->encoder->encode($this->normalizer->normalize($data));
}
}
L'injection par constructeur
class Serializer {
private $normalizer;
private $encoder;
public function __construct($encoder, $normalizer) {
$this->encoder = $encoder;
$this->normalizer = $normalizer;
}
public function serialize($data) {
return $this->encoder->encode($this->normalizer->normalize($data));
}
}
On délègue à un service extérieur l'instantiation de nos dépendances
Mais qui fait ça ?
Le service container !
Plan
- Pourquoi DI ?
- Container ?
- DI constructor / setter / ..
- DI dans symfony
- Autowiring
- Autoconfigure - chain encoder / normalizers
deck
By Louis Pinsard
deck
- 601