Skip to content

Commit

Permalink
[DependencyInjection] made an optimization on dumped DIC
Browse files Browse the repository at this point in the history
When dumping a Container, and if it is frozen, we use a plain
PHP array for parameters instead of a ParameterBag.
  • Loading branch information
fabpot committed Feb 3, 2011
1 parent 2d69369 commit b6f400a
Show file tree
Hide file tree
Showing 4 changed files with 129 additions and 117 deletions.
98 changes: 89 additions & 9 deletions src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
Expand Up @@ -71,14 +71,22 @@ public function dump(array $options = array())
'base_class' => 'Container',
), $options);

return
$this->startClass($options['class'], $options['base_class']).
$this->addConstructor().
$code = $this->startClass($options['class'], $options['base_class']);

if ($this->container->isFrozen()) {
$code .= $this->addFrozenConstructor();
} else {
$code .= $this->addConstructor();
}

$code .=
$this->addServices().
$this->addDefaultParametersMethod().
$this->addInterfaceInjectors().
$this->endClass()
;

return $code;
}

protected function addInterfaceInjectors()
Expand Down Expand Up @@ -515,7 +523,7 @@ protected function addServices()

protected function startClass($class, $baseClass)
{
$bagClass = $this->container->isFrozen() ? 'FrozenParameterBag' : 'ParameterBag';
$bagClass = $this->container->isFrozen() ? '' : 'use Symfony\Component\DependencyInjection\ParameterBag\\ParameterBag;';

return <<<EOF
<?php
Expand All @@ -524,7 +532,7 @@ protected function startClass($class, $baseClass)
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\ParameterBag\\$bagClass;
$bagClass
/**
* $class
Expand All @@ -539,16 +547,14 @@ class $class extends $baseClass

protected function addConstructor()
{
$bagClass = $this->container->isFrozen() ? 'FrozenParameterBag' : 'ParameterBag';

$code = <<<EOF
/**
* Constructor.
*/
public function __construct()
{
parent::__construct(new $bagClass(\$this->getDefaultParameters()));
parent::__construct(new ParameterBag(\$this->getDefaultParameters()));
EOF;

Expand All @@ -561,6 +567,42 @@ public function __construct()
$code .= <<<EOF
}
EOF;

return $code;
}

protected function addFrozenConstructor()
{
$code = <<<EOF
/**
* Constructor.
*/
public function __construct()
{
\$this->parameters = \$this->getDefaultParameters();
\$this->services =
\$this->scopedServices =
\$this->scopeStacks = array();
\$this->set('service_container', \$this);
EOF;

$code .= "\n";
if (count($scopes = $this->container->getScopes()) > 0) {
$code .= " \$this->scopes = ".$this->dumpValue($scopes).";\n";
$code .= " \$this->scopeChildren = ".$this->dumpValue($this->container->getScopeChildren()).";\n";
} else {
$code .= " \$this->scopes = array();\n";
$code .= " \$this->scopeChildren = array();\n";
}

$code .= <<<EOF
}
EOF;

return $code;
Expand All @@ -574,7 +616,43 @@ protected function addDefaultParametersMethod()

$parameters = $this->exportParameters($this->container->getParameterBag()->all());

return <<<EOF
$code = '';
if ($this->container->isFrozen()) {
$code .= <<<EOF
/**
* {@inheritdoc}
*/
public function getParameter(\$name)
{
\$name = strtolower(\$name);
if (!array_key_exists(\$name, \$this->parameters)) {
throw new \InvalidArgumentException(sprintf('The parameter "%s" must be defined.', \$name));
}
return \$this->parameters[\$name];
}
/**
* {@inheritdoc}
*/
public function hasParameter(\$name)
{
return array_key_exists(strtolower(\$name), \$this->parameters);
}
/**
* {@inheritdoc}
*/
public function setParameter(\$name, \$value)
{
throw new \LogicException('Impossible to call set() on a frozen ParameterBag.');
}
EOF;
}

$code .= <<<EOF
/**
* Gets the default parameters.
Expand All @@ -587,6 +665,8 @@ protected function getDefaultParameters()
}
EOF;

return $code;
}

protected function exportParameters($parameters, $indent = 12)
Expand Down
3 changes: 0 additions & 3 deletions src/Symfony/Component/HttpKernel/Resources/bin/packager.php
Expand Up @@ -27,9 +27,6 @@
'Symfony\\Component\\DependencyInjection\\Container',
'Symfony\\Component\\DependencyInjection\\ContainerAwareInterface',
'Symfony\\Component\\DependencyInjection\\ContainerAware',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag',
'Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag',

'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface',
'Symfony\\Component\\HttpKernel\\Bundle\\Bundle',
Expand Down
103 changes: 0 additions & 103 deletions src/Symfony/Component/HttpKernel/bootstrap.php
Expand Up @@ -219,109 +219,6 @@ public function setContainer(ContainerInterface $container = null)
}
}
}
namespace Symfony\Component\DependencyInjection\ParameterBag
{
interface ParameterBagInterface
{
function clear();
function add(array $parameters);
function all();
function get($name);
function set($name, $value);
function has($name);
}
}
namespace Symfony\Component\DependencyInjection\ParameterBag
{
class ParameterBag implements ParameterBagInterface
{
protected $parameters;
public function __construct(array $parameters = array())
{
$this->parameters = array();
$this->add($parameters);
}
public function clear()
{
$this->parameters = array();
}
public function add(array $parameters)
{
foreach ($parameters as $key => $value) {
$this->parameters[strtolower($key)] = $value;
}
}
public function all()
{
return $this->parameters;
}
public function get($name)
{
$name = strtolower($name);
if (!array_key_exists($name, $this->parameters)) {
throw new \InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
}
return $this->parameters[$name];
}
public function set($name, $value)
{
$this->parameters[strtolower($name)] = $value;
}
public function has($name)
{
return array_key_exists(strtolower($name), $this->parameters);
}
public function resolve()
{
foreach ($this->parameters as $key => $value) {
$this->parameters[$key] = $this->resolveValue($value);
}
}
public function resolveValue($value)
{
if (is_array($value)) {
$args = array();
foreach ($value as $k => $v) {
$args[$this->resolveValue($k)] = $this->resolveValue($v);
}
return $args;
}
if (!is_string($value)) {
return $value;
}
if (preg_match('/^%([^%]+)%$/', $value, $match)) {
return $this->get(strtolower($match[1]));
}
return str_replace('%%', '%', preg_replace_callback(array('/(?<!%)%([^%]+)%/'), array($this, 'resolveValueCallback'), $value));
}
protected function resolveValueCallback($match)
{
return $this->get(strtolower($match[1]));
}
}
}
namespace Symfony\Component\DependencyInjection\ParameterBag
{
class FrozenParameterBag extends ParameterBag
{
public function __construct(array $parameters = array())
{
$this->parameters = $parameters;
}
public function clear()
{
throw new \LogicException('Impossible to call clear() on a frozen ParameterBag.');
}
public function add(array $parameters)
{
throw new \LogicException('Impossible to call add() on a frozen ParameterBag.');
}
public function set($name, $value)
{
throw new \LogicException('Impossible to call set() on a frozen ParameterBag.');
}
}
}
namespace Symfony\Component\HttpKernel\Bundle
{
interface BundleInterface
Expand Down
Expand Up @@ -4,7 +4,7 @@
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;


/**
* ProjectServiceContainer
Expand All @@ -19,7 +19,16 @@ class ProjectServiceContainer extends Container
*/
public function __construct()
{
parent::__construct(new FrozenParameterBag($this->getDefaultParameters()));
$this->parameters = $this->getDefaultParameters();

$this->services =
$this->scopedServices =
$this->scopeStacks = array();

$this->set('service_container', $this);

$this->scopes = array();
$this->scopeChildren = array();
}

/**
Expand All @@ -39,6 +48,35 @@ protected function getFooService()
return $instance;
}

/**
* {@inheritdoc}
*/
public function getParameter($name)
{
$name = strtolower($name);

if (!array_key_exists($name, $this->parameters)) {
throw new \InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
}

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

/**
* {@inheritdoc}
*/
public function hasParameter($name)
{
return array_key_exists(strtolower($name), $this->parameters);
}

/**
* {@inheritdoc}
*/
public function setParameter($name, $value)
{
throw new \LogicException('Impossible to call set() on a frozen ParameterBag.');
}
/**
* Gets the default parameters.
*
Expand Down

0 comments on commit b6f400a

Please sign in to comment.