Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
ParameterBag.php
001 <?php
002
003 /*
004 * This file is part of the Symfony package.
005 *
006 * (c) Fabien Potencier <fabien@symfony.com>
007 *
008 * For the full copyright and license information, please view the LICENSE
009 * file that was distributed with this source code.
010 */
011
012 namespace Symfony\Component\DependencyInjection\ParameterBag;
013
014 use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
015 use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
016 use Symfony\Component\DependencyInjection\Exception\RuntimeException;
017
018 /**
019 * Holds parameters.
020 *
021 * @author Fabien Potencier <fabien@symfony.com>
022 */
023 class ParameterBag implements ParameterBagInterface
024 {
025 protected $parameters = array();
026 protected $resolved = false;
027
028 /**
029 * @param array $parameters An array of parameters
030 */
031 public function __construct(array $parameters = array())
032 {
033 $this->add($parameters);
034 }
035
036 /**
037 * Clears all parameters.
038 */
039 public function clear()
040 {
041 $this->parameters = array();
042 }
043
044 /**
045 * Adds parameters to the service container parameters.
046 *
047 * @param array $parameters An array of parameters
048 */
049 public function add(array $parameters)
050 {
051 foreach ($parameters as $key => $value) {
052 $this->parameters[strtolower($key)] = $value;
053 }
054 }
055
056 /**
057 * {@inheritdoc}
058 */
059 public function all()
060 {
061 return $this->parameters;
062 }
063
064 /**
065 * {@inheritdoc}
066 */
067 public function get($name)
068 {
069 $name = strtolower($name);
070
071 if (!array_key_exists($name, $this->parameters)) {
072 if (!$name) {
073 throw new ParameterNotFoundException($name);
074 }
075
076 $alternatives = array();
077 foreach ($this->parameters as $key => $parameterValue) {
078 $lev = levenshtein($name, $key);
079 if ($lev <= strlen($name) / 3 || false !== strpos($key, $name)) {
080 $alternatives[] = $key;
081 }
082 }
083
084 throw new ParameterNotFoundException($name, null, null, null, $alternatives);
085 }
086
087 return $this->parameters[$name];
088 }
089
090 /**
091 * Sets a service container parameter.
092 *
093 * @param string $name The parameter name
094 * @param mixed $value The parameter value
095 */
096 public function set($name, $value)
097 {
098 $this->parameters[strtolower($name)] = $value;
099 }
100
101 /**
102 * {@inheritdoc}
103 */
104 public function has($name)
105 {
106 return array_key_exists(strtolower($name), $this->parameters);
107 }
108
109 /**
110 * Removes a parameter.
111 *
112 * @param string $name The parameter name
113 */
114 public function remove($name)
115 {
116 unset($this->parameters[strtolower($name)]);
117 }
118
119 /**
120 * {@inheritdoc}
121 */
122 public function resolve()
123 {
124 if ($this->resolved) {
125 return;
126 }
127
128 $parameters = array();
129 foreach ($this->parameters as $key => $value) {
130 try {
131 $value = $this->resolveValue($value);
132 $parameters[$key] = $this->unescapeValue($value);
133 } catch (ParameterNotFoundException $e) {
134 $e->setSourceKey($key);
135
136 throw $e;
137 }
138 }
139
140 $this->parameters = $parameters;
141 $this->resolved = true;
142 }
143
144 /**
145 * Replaces parameter placeholders (%name%) by their values.
146 *
147 * @param mixed $value A value
148 * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
149 *
150 * @return mixed The resolved value
151 *
152 * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
153 * @throws ParameterCircularReferenceException if a circular reference if detected
154 * @throws RuntimeException when a given parameter has a type problem.
155 */
156 public function resolveValue($value, array $resolving = array())
157 {
158 if (is_array($value)) {
159 $args = array();
160 foreach ($value as $k => $v) {
161 $args[$this->resolveValue($k, $resolving)] = $this->resolveValue($v, $resolving);
162 }
163
164 return $args;
165 }
166
167 if (!is_string($value)) {
168 return $value;
169 }
170
171 return $this->resolveString($value, $resolving);
172 }
173
174 /**
175 * Resolves parameters inside a string.
176 *
177 * @param string $value The string to resolve
178 * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
179 *
180 * @return string The resolved string
181 *
182 * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
183 * @throws ParameterCircularReferenceException if a circular reference if detected
184 * @throws RuntimeException when a given parameter has a type problem.
185 */
186 public function resolveString($value, array $resolving = array())
187 {
188 // we do this to deal with non string values (Boolean, integer, ...)
189 // as the preg_replace_callback throw an exception when trying
190 // a non-string in a parameter value
191 if (preg_match('/^%([^%\s]+)%$/', $value, $match)) {
192 $key = strtolower($match[1]);
193
194 if (isset($resolving[$key])) {
195 throw new ParameterCircularReferenceException(array_keys($resolving));
196 }
197
198 $resolving[$key] = true;
199
200 return $this->resolved ? $this->get($key) : $this->resolveValue($this->get($key), $resolving);
201 }
202
203 $self = $this;
204
205 return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($self, $resolving, $value) {
206 // skip %%
207 if (!isset($match[1])) {
208 return '%%';
209 }
210
211 $key = strtolower($match[1]);
212 if (isset($resolving[$key])) {
213 throw new ParameterCircularReferenceException(array_keys($resolving));
214 }
215
216 $resolved = $self->get($key);
217
218 if (!is_string($resolved) && !is_numeric($resolved)) {
219 throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "%s" of type %s inside string value "%s".', $key, gettype($resolved), $value));
220 }
221
222 $resolved = (string) $resolved;
223 $resolving[$key] = true;
224
225 return $self->isResolved() ? $resolved : $self->resolveString($resolved, $resolving);
226 }, $value);
227 }
228
229 public function isResolved()
230 {
231 return $this->resolved;
232 }
233
234 /**
235 * {@inheritdoc}
236 */
237 public function escapeValue($value)
238 {
239 if (is_string($value)) {
240 return str_replace('%', '%%', $value);
241 }
242
243 if (is_array($value)) {
244 $result = array();
245 foreach ($value as $k => $v) {
246 $result[$k] = $this->escapeValue($v);
247 }
248
249 return $result;
250 }
251
252 return $value;
253 }
254
255 /**
256 * {@inheritdoc}
257 */
258 public function unescapeValue($value)
259 {
260 if (is_string($value)) {
261 return str_replace('%%', '%', $value);
262 }
263
264 if (is_array($value)) {
265 $result = array();
266 foreach ($value as $k => $v) {
267 $result[$k] = $this->unescapeValue($v);
268 }
269
270 return $result;
271 }
272
273 return $value;
274 }
275 }
276