Skip to content

Commit

Permalink
Add query parser
Browse files Browse the repository at this point in the history
  • Loading branch information
jderusse committed Nov 5, 2018
1 parent 345b19b commit cdf9e79
Show file tree
Hide file tree
Showing 5 changed files with 158 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/Symfony/Component/DependencyInjection/CHANGELOG.md
@@ -1,6 +1,12 @@
CHANGELOG
=========

4.3.0
-----

* added `%env(url:...)%` processor to convert an URL or DNS into an array of components
* added `%env(query:...)%` processor to convert a query string into an array of key values

4.2.0
-----

Expand All @@ -10,7 +16,6 @@ CHANGELOG
* added `ServiceLocatorArgument` and `!service_locator` config tag for creating optimized service-locators
* added support for autoconfiguring bindings
* added `%env(key:...)%` processor to fetch a specific key from an array
* added `%env(url:...)%` processor to parse an URL or DNS
* deprecated `ServiceSubscriberInterface`, use the same interface from the `Symfony\Contracts\Service` namespace instead
* deprecated `ResettableContainerInterface`, use `Symfony\Contracts\Service\ResetInterface` instead

Expand Down
7 changes: 7 additions & 0 deletions src/Symfony/Component/DependencyInjection/EnvVarProcessor.php
Expand Up @@ -44,6 +44,7 @@ public static function getProvidedTypes()
'json' => 'array',
'key' => 'bool|int|float|string|array',
'url' => 'array',
'query' => 'array',
'resolve' => 'string',
'string' => 'string',
);
Expand Down Expand Up @@ -182,6 +183,12 @@ public function getEnv($prefix, $name, \Closure $getEnv)
return $env;
}

if ('query' === $prefix) {
\parse_str($env, $result);

return $result;
}

if ('resolve' === $prefix) {
return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($name) {
if (!isset($match[1])) {
Expand Down
Expand Up @@ -40,6 +40,7 @@ public function testSimpleProcessor()
'json' => array('array'),
'key' => array('bool', 'int', 'float', 'string', 'array'),
'url' => array('array'),
'query' => array('array'),
'resolve' => array('string'),
'string' => array('string'),
);
Expand Down
Expand Up @@ -465,6 +465,26 @@ public function testDumpedUrlEnvParameters()
), $container->getParameter('hello'));
}

public function testDumpedQueryEnvParameters()
{
$container = new ContainerBuilder();
$container->setParameter('env(foo)', 'foo=bar&baz[]=qux');
$container->setParameter('hello', '%env(query:foo)%');
$container->compile();

$dumper = new PhpDumper($container);
$dumper->dump();

$this->assertStringEqualsFile(self::$fixturesPath.'/php/services_query_env.php', $dumper->dump(array('class' => 'Symfony_DI_PhpDumper_Test_QueryParameters')));

require self::$fixturesPath.'/php/services_query_env.php';
$container = new \Symfony_DI_PhpDumper_Test_QueryParameters();
$this->assertSame(array(
'foo' => 'bar',
'baz' => array('qux'),
), $container->getParameter('hello'));
}

public function testDumpedJsonEnvParameters()
{
$container = new ContainerBuilder();
Expand Down
@@ -0,0 +1,124 @@
<?php

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;

/**
* This class has been auto-generated
* by the Symfony Dependency Injection Component.
*
* @final since Symfony 3.3
*/
class Symfony_DI_PhpDumper_Test_QueryParameters extends Container
{
private $parameters;
private $targetDirs = array();

public function __construct()
{
$this->parameters = $this->getDefaultParameters();

$this->services = $this->privates = array();

$this->aliases = array();
}

public function compile()
{
throw new LogicException('You cannot compile a dumped container that was already compiled.');
}

public function isCompiled()
{
return true;
}

public function getRemovedIds()
{
return array(
'Psr\\Container\\ContainerInterface' => true,
'Symfony\\Component\\DependencyInjection\\ContainerInterface' => true,
);
}

public function getParameter($name)
{
$name = (string) $name;

if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
}
if (isset($this->loadedDynamicParameters[$name])) {
return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
}

return $this->parameters[$name];
}

public function hasParameter($name)
{
$name = (string) $name;

return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters);
}

public function setParameter($name, $value)
{
throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
}

public function getParameterBag()
{
if (null === $this->parameterBag) {
$parameters = $this->parameters;
foreach ($this->loadedDynamicParameters as $name => $loaded) {
$parameters[$name] = $loaded ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
}
$this->parameterBag = new FrozenParameterBag($parameters);
}

return $this->parameterBag;
}

private $loadedDynamicParameters = array(
'hello' => false,
);
private $dynamicParameters = array();

/**
* Computes a dynamic parameter.
*
* @param string The name of the dynamic parameter to load
*
* @return mixed The value of the dynamic parameter
*
* @throws InvalidArgumentException When the dynamic parameter does not exist
*/
private function getDynamicParameter($name)
{
switch ($name) {
case 'hello': $value = $this->getEnv('query:foo'); break;
default: throw new InvalidArgumentException(sprintf('The dynamic parameter "%s" must be defined.', $name));
}
$this->loadedDynamicParameters[$name] = true;

return $this->dynamicParameters[$name] = $value;
}

/**
* Gets the default parameters.
*
* @return array An array of the default parameters
*/
protected function getDefaultParameters()
{
return array(
'env(foo)' => 'foo=bar&baz[]=qux',
);
}
}

0 comments on commit cdf9e79

Please sign in to comment.