Skip to content

Commit a1b1e94

Browse files
committed
CompilerExtension: added $initialization as replacement for modifying initialize() method
1 parent cc4e662 commit a1b1e94

File tree

6 files changed

+38
-16
lines changed

6 files changed

+38
-16
lines changed

src/DI/Compiler.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,11 @@ public function generateCode(): string
279279

280280
$generator = new PhpGenerator($this->builder);
281281
$class = $generator->generate($this->className);
282-
$class->addMethod('initialize');
283282
$this->dependencies->add($this->builder->getDependencies());
284283

285284
foreach ($this->extensions as $extension) {
286285
$extension->afterCompile($class);
286+
$generator->addInitialization($class, $extension);
287287
}
288288

289289
return $this->sources . "\n" . $generator->toString($class);

src/DI/CompilerExtension.php

+10
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,14 @@ abstract class CompilerExtension
2828
/** @var array|object */
2929
protected $config = [];
3030

31+
/** @var Nette\PhpGenerator\Closure */
32+
protected $initialization;
33+
3134

3235
/** @return static */
3336
public function setCompiler(Compiler $compiler, string $name)
3437
{
38+
$this->initialization = new Nette\PhpGenerator\Closure;
3539
$this->compiler = $compiler;
3640
$this->name = $name;
3741
return $this;
@@ -132,6 +136,12 @@ protected function createLoader(): Config\Loader
132136
}
133137

134138

139+
public function getInitialization(): Nette\PhpGenerator\Closure
140+
{
141+
return $this->initialization;
142+
}
143+
144+
135145
/**
136146
* Prepend extension name to identifier or service name.
137147
*/

src/DI/Extensions/ConstantsExtension.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
*/
1818
final class ConstantsExtension extends Nette\DI\CompilerExtension
1919
{
20-
public function afterCompile(Nette\PhpGenerator\ClassType $class)
20+
public function loadConfiguration()
2121
{
2222
foreach ($this->getConfig() as $name => $value) {
23-
$class->getMethod('initialize')->addBody('define(?, ?);', [$name, $value]);
23+
$this->initialization->addBody('define(?, ?);', [$name, $value]);
2424
}
2525
}
2626
}

src/DI/Extensions/DIExtension.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,10 @@ public function afterCompile(Nette\PhpGenerator\ClassType $class)
8282
$this->restrictTypes($class);
8383

8484
if ($this->debugMode && $this->config->debugger) {
85-
$this->enableTracyIntegration($class);
85+
$this->enableTracyIntegration();
8686
}
8787

88-
$this->initializeTaggedServices($class);
88+
$this->initializeTaggedServices();
8989
}
9090

9191

@@ -115,19 +115,19 @@ private function restrictTypes(Nette\PhpGenerator\ClassType $class): void
115115
}
116116

117117

118-
private function initializeTaggedServices(Nette\PhpGenerator\ClassType $class): void
118+
private function initializeTaggedServices(): void
119119
{
120120
foreach (array_filter($this->getContainerBuilder()->findByTag('run')) as $name => $on) {
121121
trigger_error("Tag 'run' used in service '$name' definition is deprecated.", E_USER_DEPRECATED);
122-
$class->getMethod('initialize')->addBody('$this->getService(?);', [$name]);
122+
$this->initialization->addBody('$this->getService(?);', [$name]);
123123
}
124124
}
125125

126126

127-
private function enableTracyIntegration(Nette\PhpGenerator\ClassType $class): void
127+
private function enableTracyIntegration(): void
128128
{
129129
Nette\Bridges\DITracy\ContainerPanel::$compilationTime = $this->time;
130-
$class->getMethod('initialize')->addBody($this->getContainerBuilder()->formatPhp('?;', [
130+
$this->initialization->addBody($this->getContainerBuilder()->formatPhp('?;', [
131131
new Nette\DI\Definitions\Statement('@Tracy\Bar::addPanel', [new Nette\DI\Definitions\Statement(Nette\Bridges\DITracy\ContainerPanel::class)]),
132132
]));
133133
}

src/DI/Extensions/PhpExtension.php

+6-7
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,26 @@ public function getConfigSchema(): Nette\Schema\Schema
2323
}
2424

2525

26-
public function afterCompile(Nette\PhpGenerator\ClassType $class)
26+
public function loadConfiguration()
2727
{
28-
$initialize = $class->getMethod('initialize');
2928
foreach ($this->getConfig() as $name => $value) {
3029
if ($value === null) {
3130
continue;
3231

3332
} elseif ($name === 'include_path') {
34-
$initialize->addBody('set_include_path(?);', [str_replace(';', PATH_SEPARATOR, $value)]);
33+
$this->initialization->addBody('set_include_path(?);', [str_replace(';', PATH_SEPARATOR, $value)]);
3534

3635
} elseif ($name === 'ignore_user_abort') {
37-
$initialize->addBody('ignore_user_abort(?);', [$value]);
36+
$this->initialization->addBody('ignore_user_abort(?);', [$value]);
3837

3938
} elseif ($name === 'max_execution_time') {
40-
$initialize->addBody('set_time_limit(?);', [$value]);
39+
$this->initialization->addBody('set_time_limit(?);', [$value]);
4140

4241
} elseif ($name === 'date.timezone') {
43-
$initialize->addBody('date_default_timezone_set(?);', [$value]);
42+
$this->initialization->addBody('date_default_timezone_set(?);', [$value]);
4443

4544
} elseif (function_exists('ini_set')) {
46-
$initialize->addBody('ini_set(?, ?);', [$name, $value === false ? '0' : (string) $value]);
45+
$this->initialization->addBody('ini_set(?, ?);', [$name, $value === false ? '0' : (string) $value]);
4746

4847
} elseif (ini_get($name) != $value) { // intentionally ==
4948
throw new Nette\NotSupportedException('Required function ini_set() is disabled.');

src/DI/PhpGenerator.php

+13
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public function generate(string $className): Nette\PhpGenerator\ClassType
6868
->setReturnType($className)
6969
->setBody('return $this;');
7070

71+
$class->addMethod('initialize');
72+
7173
return $class;
7274
}
7375

@@ -82,6 +84,17 @@ public function toString(Nette\PhpGenerator\ClassType $class): string
8284
}
8385

8486

87+
public function addInitialization(Nette\PhpGenerator\ClassType $class, CompilerExtension $extension): void
88+
{
89+
$closure = $extension->getInitialization();
90+
if ($closure->getBody()) {
91+
$class->getMethod('initialize')
92+
->addBody('// ' . $extension->prefix(''))
93+
->addBody("($closure)();");
94+
}
95+
}
96+
97+
8598
public function generateMethod(Definitions\Definition $def): Nette\PhpGenerator\Method
8699
{
87100
$name = $def->getName();

0 commit comments

Comments
 (0)