L'injection de dépendance
- Version 4.x
- Version 3.x
- Version 2.x
Depuis la version 3, la librairie Jaxon permet de passer des classes ou des interfaces en paramètres des constructeurs des classes Jaxon.
Le conteneur de dépendances est configuré à l'initialisation de la librairie ou dans son fichier de configuration. Les dépendances sont passées aux classes Jaxon soit dans leur constructeur, soit à l'aide d'une annotation.
Le conteneur de dépendances
Le conteneur de dépendances est obtenu à l'aide d'un appel à jaxon()->di()
.
Il fournit quatre fonctions pour configurer les dépendances.
Définir la fonction qui renvoie une dépendance.
jaxon()->di()->set(\Name\Space\Class\Name::class, function($di) {
// Retourner l'instance de la classe.
// La variable $di permet de récupérer d'autres valeurs dans le conteneur.
});
Découvrir automatiquement les dépendances d'une classe en analysant son constructeur.
jaxon()->di()->auto(\Name\Space\Auto\Name::class);
Définir un alias d'une dépendance.
jaxon()->di()->alias(\Name\Space\Interface\Name::class, \Name\Space\Class\Name::class);
Définir la valeur d'une dépendance.
jaxon()->di()->val('di_var_id', $varValue);
Les dépendances peuvent également être définies dans le fichier de configuration.
'app' => [
'container' => [
'set' => [
\Name\Space\Class\Name::class => function($di) {
// Retourner l'instance de la classe.
// La variable $di permet de récupérer d'autres valeurs dans le conteneur.
}
],
'auto' => [
\Name\Space\Auto\Name::class,
],
'alias' => [
\Name\Space\Interface\Name::class => \Name\Space\Class\Name::class
],
'val' => [
'di_var_id' => $varValue
],
],
],
Utilisation des dépendances
Les dépendances sont passées en paramètre aux constructeurs des classes Jaxon.
class Test extends \Jaxon\App\CallableClass
{
protected $service;
public function __construct(\Name\Space\Class\Name::class $service)
{
$this->service = $service;
}
}
Il est également possible d'utiliser les annotations, qui offrent plus de possibilités.
/**
* @di $service \Name\Space\Class\Name
*/
class Test extends \Jaxon\App\CallableClass
{
protected $service;
}
Ou encore,
class Test extends \Jaxon\App\CallableClass
{
/**
* @di
* @var \Name\Space\Class\Name
*/
protected $service;
}
Les dépendances peuvent aussi être injectées directement dans une méthode.
class Test extends \Jaxon\App\CallableClass
{
/**
* @var \Name\Space\Class\Name
*/
protected $service;
/**
* @di $service
*/
public function doThat()
{
$value = $this->service->do();
// ...
return $this->response;
}
}