PluginProbe
Packeta / trunk
Packeta vtrunk
2.3.2 2.3.1 trunk 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3.0 1.3.1 1.3.2 1.4 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 All 56 releases
packeta / deps / nette / di / src / DI / Extensions / ParametersExtension.php

ParametersExtension.php in Packeta trunk, at deps/nette/di/src/DI/Extensions/ParametersExtension.php

90 lines 3.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 declare (strict_types=1);
8 namespace Packetery\Nette\DI\Extensions;
9
10 use Packetery\Nette;
11 use Packetery\Nette\DI\Container;
12 use Packetery\Nette\DI\DynamicParameter;
13 use Packetery\Nette\DI\Helpers;
14 use Packetery\Nette\PhpGenerator\Method;
15 /**
16 * Parameters.
17 */
18 final class ParametersExtension extends \Packetery\Nette\DI\CompilerExtension
19 {
20 /** @var string[] */
21 public $dynamicParams = [];
22 /** @var string[][] */
23 public $dynamicValidators = [];
24 /** @var array */
25 private $compilerConfig;
26 public function __construct(array &$compilerConfig)
27 {
28 $this->compilerConfig =& $compilerConfig;
29 }
30 public function loadConfiguration()
31 {
32 $builder = $this->getContainerBuilder();
33 $params = $this->config;
34 foreach ($this->dynamicParams as $key) {
35 $params[$key] = new DynamicParameter('$this->getParameter(' . \var_export($key, \true) . ')');
36 }
37 $builder->parameters = Helpers::expand($params, $params, \true);
38 // expand all except 'services'
39 $slice = \array_diff_key($this->compilerConfig, ['services' => 1]);
40 $slice = Helpers::expand($slice, $builder->parameters);
41 $this->compilerConfig = $slice + $this->compilerConfig;
42 }
43 public function afterCompile(\Packetery\Nette\PhpGenerator\ClassType $class)
44 {
45 $builder = $this->getContainerBuilder();
46 $dynamicParams = \array_fill_keys($this->dynamicParams, \true);
47 foreach ($builder->parameters as $key => $value) {
48 $value = [$value];
49 \array_walk_recursive($value, function ($val) use(&$dynamicParams, $key) : void {
50 if ($val instanceof DynamicParameter) {
51 $dynamicParams[$key] = $dynamicParams[$key] ?? \true;
52 } elseif ($val instanceof \Packetery\Nette\DI\Definitions\Statement) {
53 $dynamicParams[$key] = \false;
54 }
55 });
56 }
57 $method = Method::from([Container::class, 'getStaticParameters'])->addBody('return ?;', [\array_diff_key($builder->parameters, $dynamicParams)]);
58 $class->addMember($method);
59 if (!$dynamicParams) {
60 return;
61 }
62 $resolver = new \Packetery\Nette\DI\Resolver($builder);
63 $generator = new \Packetery\Nette\DI\PhpGenerator($builder);
64 $method = Method::from([Container::class, 'getDynamicParameter']);
65 $class->addMember($method);
66 $method->addBody('switch (true) {');
67 foreach ($dynamicParams as $key => $foo) {
68 $value = Helpers::expand($this->config[$key] ?? null, $builder->parameters);
69 try {
70 $value = $generator->convertArguments($resolver->completeArguments(Helpers::filterArguments([$value])))[0];
71 $method->addBody("\tcase \$key === ?: return ?;", [$key, $value]);
72 } catch (\Packetery\Nette\DI\ServiceCreationException $e) {
73 $method->addBody("\tcase \$key === ?: throw new \\Packetery\\Nette\\DI\\ServiceCreationException(?);", [$key, $e->getMessage()]);
74 }
75 }
76 $method->addBody("\tdefault: return parent::getDynamicParameter(\$key);\n};");
77 if ($preload = \array_keys($dynamicParams, \true, \true)) {
78 $method = Method::from([Container::class, 'getParameters']);
79 $class->addMember($method);
80 $method->addBody('array_map([$this, \'getParameter\'], ?);', [$preload]);
81 $method->addBody('return parent::getParameters();');
82 }
83 foreach ($this->dynamicValidators as [$param, $expected, $path]) {
84 if ($param instanceof DynamicParameter) {
85 $this->initialization->addBody('\\Packetery\\Nette\\Utils\\Validators::assert(?, ?, ?);', [$param, $expected, "dynamic parameter used in '" . \implode(" › ", $path) . "'"]);
86 }
87 }
88 }
89 }
90