annotate vendor/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php @ 8:50b0d041100e

Further files for download
author Chris Cannam
date Mon, 05 Feb 2018 10:56:40 +0000
parents 4c8ae668cc8c
children 1fec387a4317
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Symfony package.
Chris@0 5 *
Chris@0 6 * (c) Fabien Potencier <fabien@symfony.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Symfony\Component\DependencyInjection\ParameterBag;
Chris@0 13
Chris@0 14 use Symfony\Component\DependencyInjection\Exception\RuntimeException;
Chris@0 15 use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
Chris@0 16
Chris@0 17 /**
Chris@0 18 * @author Nicolas Grekas <p@tchwork.com>
Chris@0 19 */
Chris@0 20 class EnvPlaceholderParameterBag extends ParameterBag
Chris@0 21 {
Chris@0 22 private $envPlaceholders = array();
Chris@0 23
Chris@0 24 /**
Chris@0 25 * {@inheritdoc}
Chris@0 26 */
Chris@0 27 public function get($name)
Chris@0 28 {
Chris@0 29 if (0 === strpos($name, 'env(') && ')' === substr($name, -1) && 'env()' !== $name) {
Chris@0 30 $env = substr($name, 4, -1);
Chris@0 31
Chris@0 32 if (isset($this->envPlaceholders[$env])) {
Chris@0 33 foreach ($this->envPlaceholders[$env] as $placeholder) {
Chris@0 34 return $placeholder; // return first result
Chris@0 35 }
Chris@0 36 }
Chris@0 37 if (preg_match('/\W/', $env)) {
Chris@0 38 throw new InvalidArgumentException(sprintf('Invalid %s name: only "word" characters are allowed.', $name));
Chris@0 39 }
Chris@0 40
Chris@0 41 if ($this->has($name)) {
Chris@0 42 $defaultValue = parent::get($name);
Chris@0 43
Chris@0 44 if (null !== $defaultValue && !is_scalar($defaultValue)) {
Chris@0 45 throw new RuntimeException(sprintf('The default value of an env() parameter must be scalar or null, but "%s" given to "%s".', gettype($defaultValue), $name));
Chris@0 46 }
Chris@0 47 }
Chris@0 48
Chris@0 49 $uniqueName = md5($name.uniqid(mt_rand(), true));
Chris@0 50 $placeholder = sprintf('env_%s_%s', $env, $uniqueName);
Chris@0 51 $this->envPlaceholders[$env][$placeholder] = $placeholder;
Chris@0 52
Chris@0 53 return $placeholder;
Chris@0 54 }
Chris@0 55
Chris@0 56 return parent::get($name);
Chris@0 57 }
Chris@0 58
Chris@0 59 /**
Chris@0 60 * Returns the map of env vars used in the resolved parameter values to their placeholders.
Chris@0 61 *
Chris@0 62 * @return string[][] A map of env var names to their placeholders
Chris@0 63 */
Chris@0 64 public function getEnvPlaceholders()
Chris@0 65 {
Chris@0 66 return $this->envPlaceholders;
Chris@0 67 }
Chris@0 68
Chris@0 69 /**
Chris@0 70 * Merges the env placeholders of another EnvPlaceholderParameterBag.
Chris@0 71 */
Chris@0 72 public function mergeEnvPlaceholders(self $bag)
Chris@0 73 {
Chris@0 74 if ($newPlaceholders = $bag->getEnvPlaceholders()) {
Chris@0 75 $this->envPlaceholders += $newPlaceholders;
Chris@0 76
Chris@0 77 foreach ($newPlaceholders as $env => $placeholders) {
Chris@0 78 $this->envPlaceholders[$env] += $placeholders;
Chris@0 79 }
Chris@0 80 }
Chris@0 81 }
Chris@0 82
Chris@0 83 /**
Chris@0 84 * {@inheritdoc}
Chris@0 85 */
Chris@0 86 public function resolve()
Chris@0 87 {
Chris@0 88 if ($this->resolved) {
Chris@0 89 return;
Chris@0 90 }
Chris@0 91 parent::resolve();
Chris@0 92
Chris@0 93 foreach ($this->envPlaceholders as $env => $placeholders) {
Chris@0 94 if (!isset($this->parameters[$name = strtolower("env($env)")])) {
Chris@0 95 continue;
Chris@0 96 }
Chris@0 97 if (is_numeric($default = $this->parameters[$name])) {
Chris@0 98 $this->parameters[$name] = (string) $default;
Chris@0 99 } elseif (null !== $default && !is_scalar($default)) {
Chris@0 100 throw new RuntimeException(sprintf('The default value of env parameter "%s" must be scalar or null, %s given.', $env, gettype($default)));
Chris@0 101 }
Chris@0 102 }
Chris@0 103 }
Chris@0 104 }