Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Dependency Injector
A simple and lightweight dependency injector. You will need nothing more to tests your old legacy code.
## What is a dependency
Something that your script needs to work correct. For example an instance of `Calculator` or `Config`. Or even
a class itself.
## Examples
### The `Config`
```php
<?php
class Config {
private static $_instance;
public $database = [
'host' => 'localhost',
'user' => 'john',
'password' => 'does.secret',
'database' => 'john_doe'
];
public $redis = ['host' => 'localhost'];
private function __construct() {
// maybe some logic to change the config or initialize variables
}
public static function getInstance() {
if (!self::$_instance) {
self::$_instance = new Config();
}
return self::$_instance;
}
}
class_alias('DependencyInjector', 'DI'); // create an alias for easier access
DI::set('config', function() { return Config::getInstance(); });
function someStaticFunction() {
// before
if (empty(Config::getInstance()->database['host'])) {
throw new Exception('No database host configured');
}
// now
if (empty(DI::config()->database['host'])) {
throw new Exception('No database host configured');
}
// or if you prefer
if (empty(DI::get('config')->database['host'])) {
throw new Exception('No database host configured');
}
}
```
### The database connection
```php
<?php
DI::set('database', function() {
$dbConfig = DI::config()->database;
$mysql = new mysqli($dbConfig['host'], $dbConfig['user'], $dbConfig['password'], $dbConfig['database']);
if (!empty($mysql->connect_error)) {
throw new Exception('could not connect to database (' . $mysql->connect_error . ')');
}
return $mysql;
});
function someStaticFunction() {
// before it maybe looked like this
$mysql = MyApp::getDatabaseConnection();
// now
$mysql = DI::database();
$mysql->query('SELECT * FROM table');
}
```
The problem before: you can not mock the call to `MyApp::getDatabaseConnection()`. You can still not mock the call to
`DI::database()` or `DI::get('database')`. But you can set the dependency to return a mock object:
```php
<?php
class ApplicationTest extends PHPUnit_Framework_TestCase {
public function testSomeStaticFunction() {
$mock = $this->getMock(mysqli::class);
$mock->expects($this->once())->method('query')
->with('SELECT * FROM table');
DI::set('database', function() use($mock) { return $mock; });
someStaticFunction();
}
}
```