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

  • 526