You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.1 KiB
105 lines
3.1 KiB
<?php |
|
|
|
/* |
|
* This file is part of the Symfony package. |
|
* |
|
* (c) Fabien Potencier <fabien@symfony.com> |
|
* |
|
* For the full copyright and license information, please view the LICENSE |
|
* file that was distributed with this source code. |
|
*/ |
|
|
|
namespace Symfony\Component\DependencyInjection\Loader; |
|
|
|
use Symfony\Component\Config\Util\XmlUtils; |
|
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; |
|
|
|
/** |
|
* IniFileLoader loads parameters from INI files. |
|
* |
|
* @author Fabien Potencier <fabien@symfony.com> |
|
*/ |
|
class IniFileLoader extends FileLoader |
|
{ |
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function load($resource, string $type = null) |
|
{ |
|
$path = $this->locator->locate($resource); |
|
|
|
$this->container->fileExists($path); |
|
|
|
// first pass to catch parsing errors |
|
$result = parse_ini_file($path, true); |
|
if (false === $result || [] === $result) { |
|
throw new InvalidArgumentException(sprintf('The "%s" file is not valid.', $resource)); |
|
} |
|
|
|
// real raw parsing |
|
$result = parse_ini_file($path, true, \INI_SCANNER_RAW); |
|
|
|
if (isset($result['parameters']) && \is_array($result['parameters'])) { |
|
foreach ($result['parameters'] as $key => $value) { |
|
$this->container->setParameter($key, $this->phpize($value)); |
|
} |
|
} |
|
|
|
if ($this->env && \is_array($result['parameters@'.$this->env] ?? null)) { |
|
foreach ($result['parameters@'.$this->env] as $key => $value) { |
|
$this->container->setParameter($key, $this->phpize($value)); |
|
} |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function supports($resource, string $type = null) |
|
{ |
|
if (!\is_string($resource)) { |
|
return false; |
|
} |
|
|
|
if (null === $type && 'ini' === pathinfo($resource, \PATHINFO_EXTENSION)) { |
|
return true; |
|
} |
|
|
|
return 'ini' === $type; |
|
} |
|
|
|
/** |
|
* Note that the following features are not supported: |
|
* * strings with escaped quotes are not supported "foo\"bar"; |
|
* * string concatenation ("foo" "bar"). |
|
* |
|
* @return mixed |
|
*/ |
|
private function phpize(string $value) |
|
{ |
|
// trim on the right as comments removal keep whitespaces |
|
if ($value !== $v = rtrim($value)) { |
|
$value = '""' === substr_replace($v, '', 1, -1) ? substr($v, 1, -1) : $v; |
|
} |
|
$lowercaseValue = strtolower($value); |
|
|
|
switch (true) { |
|
case \defined($value): |
|
return \constant($value); |
|
case 'yes' === $lowercaseValue || 'on' === $lowercaseValue: |
|
return true; |
|
case 'no' === $lowercaseValue || 'off' === $lowercaseValue || 'none' === $lowercaseValue: |
|
return false; |
|
case isset($value[1]) && ( |
|
("'" === $value[0] && "'" === $value[\strlen($value) - 1]) || |
|
('"' === $value[0] && '"' === $value[\strlen($value) - 1]) |
|
): |
|
// quoted string |
|
return substr($value, 1, -1); |
|
default: |
|
return XmlUtils::phpize($value); |
|
} |
|
} |
|
}
|
|
|