2.6. Inyección de Dependencias
2.6.1. Propósito
Implementar una arquitectura débilmente acoplada para obtener un código más mantenible, extensible y testeable.
2.6.2. Uso
DatabaseConfiguration se inyecta y DatabaseConnection obtendrá todo lo que necesita de $config. Sin Inyección de Dependencias, la configuración se crearía directamente en DatabaseConnection, lo que no es muy óptimo para testear y extender.
2.6.3. Ejemplos
Doctrine2 ORM usa inyección de dependencias e.j. para la configuración que se inyecta en un objeto
Connection. Para propósitos de testing, uno puede fácilmente crear un objeto simulado de la configuración e inyectarlo en el ObjetoConexiónmuchos frameworks ya tienen contenedores para inyección de dependencias que crean objetos a través de una matriz de configuración y los inyecta donde sea necesario (es decir, en Controladores)
2.6.4. Diagrama UML
2.6.5. Código
Puedes encontrar el código en GitHub
DatabaseConfiguration.php
1<?php
2
3declare(strict_types=1);
4
5namespace DesignPatterns\Structural\DependencyInjection;
6
7class DatabaseConfiguration
8{
9 public function __construct(
10 private string $host,
11 private int $port,
12 private string $username,
13 private string $password
14 ) {
15 }
16
17 public function getHost(): string
18 {
19 return $this->host;
20 }
21
22 public function getPort(): int
23 {
24 return $this->port;
25 }
26
27 public function getUsername(): string
28 {
29 return $this->username;
30 }
31
32 public function getPassword(): string
33 {
34 return $this->password;
35 }
36}
DatabaseConnection.php
1<?php
2
3declare(strict_types=1);
4
5namespace DesignPatterns\Structural\DependencyInjection;
6
7class DatabaseConnection
8{
9 public function __construct(private DatabaseConfiguration $configuration)
10 {
11 }
12
13 public function getDsn(): string
14 {
15 // this is just for the sake of demonstration, not a real DSN
16 // notice that only the injected config is used here, so there is
17 // a real separation of concerns here
18
19 return sprintf(
20 '%s:%s@%s:%d',
21 $this->configuration->getUsername(),
22 $this->configuration->getPassword(),
23 $this->configuration->getHost(),
24 $this->configuration->getPort()
25 );
26 }
27}
2.6.6. Test
Tests/DependencyInjectionTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace DesignPatterns\Structural\DependencyInjection\Tests;
6
7use DesignPatterns\Structural\DependencyInjection\DatabaseConfiguration;
8use DesignPatterns\Structural\DependencyInjection\DatabaseConnection;
9use PHPUnit\Framework\TestCase;
10
11class DependencyInjectionTest extends TestCase
12{
13 public function testDependencyInjection()
14 {
15 $config = new DatabaseConfiguration('localhost', 3306, 'user', '1234');
16 $connection = new DatabaseConnection($config);
17
18 $this->assertSame('user:1234@localhost:3306', $connection->getDsn());
19 }
20}