Skip to content

Commit 9b9b32c

Browse files
committed
management of dependencies moved to DependencyChecker
1 parent c69a22e commit 9b9b32c

File tree

4 files changed

+84
-20
lines changed

4 files changed

+84
-20
lines changed

src/DI/Compiler.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ class Compiler
2727
/** @var array */
2828
private $config = [];
2929

30-
/** @var string[] of file names */
31-
private $dependencies = [];
30+
/** @var DependencyChecker */
31+
private $dependencies;
3232

3333
/** @var string */
3434
private $className = 'Container';
@@ -40,6 +40,7 @@ class Compiler
4040
public function __construct(ContainerBuilder $builder = NULL)
4141
{
4242
$this->builder = $builder ?: new ContainerBuilder;
43+
$this->dependencies = new DependencyChecker;
4344
}
4445

4546

@@ -106,7 +107,7 @@ public function loadConfig($file)
106107
{
107108
$loader = new Config\Loader;
108109
$this->addConfig($loader->load($file));
109-
$this->addDependencies($loader->getDependencies());
110+
$this->dependencies->add($loader->getDependencies());
110111
return $this;
111112
}
112113

@@ -127,18 +128,18 @@ public function getConfig()
127128
*/
128129
public function addDependencies(array $files)
129130
{
130-
$this->dependencies = array_merge($this->dependencies, $files);
131+
$this->dependencies->add($files);
131132
return $this;
132133
}
133134

134135

135136
/**
136-
* Returns the unique list of dependent files.
137+
* Exports dependencies.
137138
* @return array
138139
*/
139-
public function getDependencies()
140+
public function exportDependencies()
140141
{
141-
return array_values(array_unique(array_filter($this->dependencies)));
142+
return $this->dependencies->export();
142143
}
143144

144145

@@ -225,12 +226,12 @@ public function generateCode()
225226

226227
foreach ($this->extensions as $extension) {
227228
$extension->beforeCompile();
228-
$this->dependencies[] = (new \ReflectionClass($extension))->getFileName();
229+
$this->dependencies->add([(new \ReflectionClass($extension))->getFileName()]);
229230
}
230231

231232
$classes = $this->builder->generateClasses($this->className);
232233
$classes[0]->addMethod('initialize');
233-
$this->addDependencies($this->builder->getDependencies());
234+
$this->dependencies->add($this->builder->getDependencies());
234235

235236
foreach ($this->extensions as $extension) {
236237
$extension->afterCompile($classes[0]);

src/DI/ContainerLoader.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,7 @@ private function isExpired($file)
100100
{
101101
if ($this->autoRebuild) {
102102
$meta = @unserialize(file_get_contents("$file.meta")); // @ - file may not exist
103-
$files = $meta ? array_combine($tmp = array_keys($meta), $tmp) : [];
104-
return $meta !== @array_map('filemtime', $files); // @ - files may not exist
103+
return empty($meta[0]) || DependencyChecker::isExpired($meta);
105104
}
106105
return FALSE;
107106
}
@@ -116,10 +115,9 @@ protected function generate($class, $generator)
116115
$compiler->setClassName($class);
117116
$code = call_user_func_array($generator, [& $compiler]);
118117
$code = $code ?: implode("\n\n\n", $compiler->compile());
119-
$files = $compiler->getDependencies();
120118
return [
121119
"<?php\n$code",
122-
serialize(@array_map('filemtime', array_combine($files, $files))) // @ - file may not exist
120+
serialize($compiler->exportDependencies())
123121
];
124122
}
125123

src/DI/DependencyChecker.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
/**
4+
* This file is part of the Nette Framework (https://nette.org)
5+
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
6+
*/
7+
8+
namespace Nette\DI;
9+
10+
use Nette;
11+
use ReflectionClass;
12+
13+
14+
/**
15+
* Cache dependencies checker.
16+
*/
17+
class DependencyChecker
18+
{
19+
use Nette\SmartObject;
20+
21+
/** @var array */
22+
private $dependencies = [];
23+
24+
25+
/**
26+
* Adds dependencies to the list.
27+
* @return self
28+
*/
29+
public function add(array $deps)
30+
{
31+
$this->dependencies = array_merge($this->dependencies, $deps);
32+
return $this;
33+
}
34+
35+
36+
/**
37+
* Exports dependencies.
38+
* @return array
39+
*/
40+
public function export()
41+
{
42+
$files = array_filter($this->dependencies);
43+
$files = @array_map('filemtime', array_combine($files, $files)); // @ - file may not exist
44+
return $files;
45+
}
46+
47+
48+
/**
49+
* Are dependencies expired?
50+
* @return bool
51+
*/
52+
public static function isExpired($files)
53+
{
54+
$current = @array_map('filemtime', array_combine($tmp = array_keys($files), $tmp)); // @ - files may not exist
55+
return $files !== $current;
56+
}
57+
58+
}

tests/DI/Compiler.dependencies.phpt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
use Nette\DI;
8+
use Nette\DI\DependencyChecker;
89
use Tester\Assert;
910

1011

@@ -14,19 +15,25 @@ $compiler = new DI\Compiler;
1415

1516
Assert::same(
1617
[],
17-
$compiler->getDependencies()
18+
$compiler->exportDependencies()
1819
);
20+
Assert::false(DependencyChecker::isExpired($compiler->exportDependencies()));
1921

20-
$compiler->addDependencies(['file1', 'file2']);
2122

23+
$compiler->addDependencies(['file1', __FILE__]);
2224
Assert::same(
23-
['file1', 'file2'],
24-
$compiler->getDependencies()
25+
['file1' => FALSE, __FILE__ => filemtime(__FILE__)],
26+
$compiler->exportDependencies()
2527
);
28+
Assert::false(DependencyChecker::isExpired($compiler->exportDependencies()));
2629

27-
$compiler->addDependencies(['file1', NULL, 'file3']);
2830

31+
$compiler->addDependencies(['file1', NULL, 'file3']);
2932
Assert::same(
30-
['file1', 'file2', 'file3'],
31-
$compiler->getDependencies()
33+
['file1' => FALSE, __FILE__ => filemtime(__FILE__), 'file3' => FALSE],
34+
$compiler->exportDependencies()
3235
);
36+
37+
$res = $compiler->exportDependencies();
38+
$res['file4'] = 123;
39+
Assert::true(DependencyChecker::isExpired($res));

0 commit comments

Comments
 (0)