Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
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 * @api
024 */
025 class ParameterBag implements ParameterBagInterface
026 {
027 protected $parameters;
028 protected $resolved;
029
030 /**
031 * Constructor.
032 *
033 * @param array $parameters An array of parameters
034 *
035 * @api
036 */
037 public function __construct(array $parameters = array())
038 {
039 $this->parameters = array();
040 $this->add($parameters);
041 $this->resolved = false;
042 }
043
044 /**
045 * Clears all parameters.
046 *
047 * @api
048 */
049 public function clear()
050 {
051 $this->parameters = array();
052 }
053
054 /**
055 * Adds parameters to the service container parameters.
056 *
057 * @param array $parameters An array of parameters
058 *
059 * @api
060 */
061 public function add(array $parameters)
062 {
063 foreach ($parameters as $key => $value) {
064 $this->parameters[strtolower($key)] = $value;
065 }
066 }
067
068 /**
069 * Gets the service container parameters.
070 *
071 * @return array An array of parameters
072 *
073 * @api
074 */
075 public function all()
076 {
077 return $this->parameters;
078 }
079
080 /**
081 * Gets a service container parameter.
082 *
083 * @param string $name The parameter name
084 *
085 * @return mixed The parameter value
086 *
087 * @throws ParameterNotFoundException if the parameter is not defined
088 *
089 * @api
090 */
091 public function get($name)
092 {
093 $name = strtolower($name);
094
095 if (!array_key_exists($name, $this->parameters)) {
096 if (!$name) {
097 throw new ParameterNotFoundException($name);
098 }
099
100 $alternatives = array();
101 foreach (array_keys($this->parameters) as $key) {
102 $lev = levenshtein($name, $key);
103 if ($lev <= strlen($name) / 3 || false !== strpos($key, $name)) {
104 $alternatives[] = $key;
105 }
106 }
107
108 throw new ParameterNotFoundException($name, null, null, null, $alternatives);
109 }
110
111 return $this->parameters[$name];
112 }
113
114 /**
115 * Sets a service container parameter.
116 *
117 * @param string $name The parameter name
118 * @param mixed $value The parameter value
119 *
120 * @api
121 */
122 public function set($name, $value)
123 {
124 $this->parameters[strtolower($name)] = $value;
125 }
126
127 /**
128 * Returns true if a parameter name is defined.
129 *
130 * @param string $name The parameter name
131 *
132 * @return bool true if the parameter name is defined, false otherwise
133 *
134 * @api
135 */
136 public function has($name)
137 {
138 return array_key_exists(strtolower($name), $this->parameters);
139 }
140
141 /**
142 * Removes a parameter.
143 *
144 * @param string $name The parameter name
145 *
146 * @api
147 */
148 public function remove($name)
149 {
150 unset($this->parameters[strtolower($name)]);
151 }
152
153 /**
154 * Replaces parameter placeholders (%name%) by their values for all parameters.
155 */
156 public function resolve()
157 {
158 if ($this->resolved) {
159 return;
160 }
161
162 $parameters = array();
163 foreach ($this->parameters as $key => $value) {
164 try {
165 $value = $this->resolveValue($value);
166 $parameters[$key] = $this->unescapeValue($value);
167 } catch (ParameterNotFoundException $e) {
168 $e->setSourceKey($key);
169
170 throw $e;
171 }
172 }
173
174 $this->parameters = $parameters;
175 $this->resolved = true;
176 }
177
178 /**
179 * Replaces parameter placeholders (%name%) by their values.
180 *
181 * @param mixed $value A value
182 * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
183 *
184 * @return mixed The resolved value
185 *
186 * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
187 * @throws ParameterCircularReferenceException if a circular reference if detected
188 * @throws RuntimeException when a given parameter has a type problem.
189 */
190 public function resolveValue($value, array $resolving = array())
191 {
192 if (is_array($value)) {
193 $args = array();
194 foreach ($value as $k => $v) {
195 $args[$this->resolveValue($k, $resolving)] = $this->resolveValue($v, $resolving);
196 }
197
198 return $args;
199 }
200
201 if (!is_string($value)) {
202 return $value;
203 }
204
205 return $this->resolveString($value, $resolving);
206 }
207
208 /**
209 * Resolves parameters inside a string
210 *
211 * @param string $value The string to resolve
212 * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
213 *
214 * @return string The resolved string
215 *
216 * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
217 * @throws ParameterCircularReferenceException if a circular reference if detected
218 * @throws RuntimeException when a given parameter has a type problem.
219 */
220 public function resolveString($value, array $resolving = array())
221 {
222 // we do this to deal with non string values (Boolean, integer, ...)
223 // as the preg_replace_callback throw an exception when trying
224 // a non-string in a parameter value
225 if (preg_match('/^%([^%\s]+)%$/', $value, $match)) {
226 $key = strtolower($match[1]);
227
228 if (isset($resolving[$key])) {
229 throw new ParameterCircularReferenceException(array_keys($resolving));
230 }
231
232 $resolving[$key] = true;
233
234 return $this->resolved ? $this->get($key) : $this->resolveValue($this->get($key), $resolving);
235 }
236
237 $self = $this;
238
239 return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($self, $resolving, $value) {
240 // skip %%
241 if (!isset($match[1])) {
242 return '%%';
243 }
244
245 $key = strtolower($match[1]);
246 if (isset($resolving[$key])) {
247 throw new ParameterCircularReferenceException(array_keys($resolving));
248 }
249
250 $resolved = $self->get($key);
251
252 if (!is_string($resolved) && !is_numeric($resolved)) {
253 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));
254 }
255
256 $resolved = (string) $resolved;
257 $resolving[$key] = true;
258
259 return $self->isResolved() ? $resolved : $self->resolveString($resolved, $resolving);
260 }, $value);
261 }
262
263 public function isResolved()
264 {
265 return $this->resolved;
266 }
267
268 /**
269 * {@inheritdoc}
270 */
271 public function escapeValue($value)
272 {
273 if (is_string($value)) {
274 return str_replace('%', '%%', $value);
275 }
276
277 if (is_array($value)) {
278 $result = array();
279 foreach ($value as $k => $v) {
280 $result[$k] = $this->escapeValue($v);
281 }
282
283 return $result;
284 }
285
286 return $value;
287 }
288
289 public function unescapeValue($value)
290 {
291 if (is_string($value)) {
292 return str_replace('%%', '%', $value);
293 }
294
295 if (is_array($value)) {
296 $result = array();
297 foreach ($value as $k => $v) {
298 $result[$k] = $this->unescapeValue($v);
299 }
300
301 return $result;
302 }
303
304 return $value;
305 }
306 }
307