8000 bug #9816 [DependencyInjection] fixes #9815 Syntax error in PHP dumpe… · symfony/symfony@c0e4c4a · GitHub
[go: up one dir, main page]

Skip to content

Commit c0e4c4a

Browse files
committed
bug #9816 [DependencyInjection] fixes #9815 Syntax error in PHP dumper (realityking)
This PR was merged into the 2.5-dev branch. Discussion ---------- [DependencyInjection] fixes #9815 Syntax error in PHP dumper | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #9815 | License | MIT | Doc PR | - I also updated the unit tests to test a namespaces class to prevent future issues like this one. Commits ------- e00b0f3 [DependencyInjection] fixes #9815 Syntax error in PHP dumper
2 parents baaf9b6 + e00b0f3 commit c0e4c4a

File tree

9 files changed

+75
-61
lines changed

9 files changed

+75
-61
lines changed

src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ private function addServiceConfigurator($id, $definition, $variableName = 'insta
490490
$class = $this->dumpValue($callable[0]);
491491
// If the class is a string we can optimize call_user_func away
492492
if (strpos($class, "'") === 0) {
493-
return sprintf(" \%s::%s(\$%s);\n", substr($class, 1, -1), $callable[1], $variableName);
493+
return sprintf(" %s::%s(\$%s);\n", $this->dumpLiteralClass($class), $callable[1], $variableName);
494494
}
495495

496496
return sprintf(" call_user_func(array(%s, '%s'), \$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
@@ -701,7 +701,7 @@ private function addNewInstance($id, Definition $definition, $return, $instantia
701701

702702
// If the class is a string we can optimize call_user_func away
703703
if (strpos($class, "'") === 0) {
704-
return sprintf(" $return{$instantiation}\%s::%s(%s);\n", substr($class, 1, -1), $definition->getFactoryMethod(), $arguments ? implode(', ', $arguments) : '');
704+
return sprintf(" $return{$instantiation}%s::%s(%s);\n", $this->dumpLiteralClass($class), $definition->getFactoryMethod(), $arguments ? implode(', ', $arguments) : '');
705705
}
706706

707707
return sprintf(" $return{$instantiation}call_user_func(array(%s, '%s')%s);\n", $this->dumpValue($definition->getFactoryClass()), $definition->getFactoryMethod(), $arguments ? ', '.implode(', ', $arguments) : '');
@@ -718,7 +718,7 @@ private function addNewInstance($id, Definition $definition, $return, $instantia
718718
return sprintf(" \$class = %s;\n\n $return{$instantiation}new \$class(%s);\n", $class, implode(', ', $arguments));
719719
}
720720

721-
return sprintf(" $return{$instantiation}new \\%s(%s);\n", substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
721+
return sprintf(" $return{$instantiation}new %s(%s);\n", $this->dumpLiteralClass($class), implode(', ', $arguments));
722722
}
723723

724724
/**
@@ -1248,6 +1248,18 @@ private function dumpValue($value, $interpolate = true)
12481248
}
12491249
}
12501250

1251+
/**
1252+
* Dumps a string to a literal (aka PHP Code) class value.
1253+
*
1254+
* @param string $class
1255+
*
1256+
* @return string
1257+
*/
1258+
private function dumpLiteralClass($class)
1259+
{
1260+
return '\\'.substr(str_replace('\\\\', '\\', $class), 1, -1);
1261+
}
1262+
12511263
/**
12521264
* Dumps a parameter
12531265
*

src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public function testDefinitions()
4040
{
4141
$builder = new ContainerBuilder();
4242
$definitions = array(
43-
'foo' => new Definition('FooClass'),
43+
'foo' => new Definition('Bar\FooClass'),
4444
'bar' => new Definition('BarClass'),
4545
);
4646
$builder->setDefinitions($definitions);
@@ -69,7 +69,7 @@ public function testDefinitions()
6969
public function testRegister()
7070
{
7171
$builder = new ContainerBuilder();
72-
$builder->register('foo', 'FooClass');
72+
$builder->register('foo', 'Bar\FooClass');
7373
$this->assertTrue($builder->hasDefinition('foo'), '->register() registers a new service definition');
7474
$this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $builder->getDefinition('foo'), '->register() returns the newly created Definition instance');
7575
}
@@ -81,7 +81,7 @@ public function testHas()
8181
{
8282
$builder = new ContainerBuilder();
8383
$this->assertFalse($builder->has('foo'), '->has() returns false if the service does not exist');
84-
$builder->register('foo', 'FooClass');
84+
$builder->register('foo', 'Bar\FooClass');
8585
$this->assertTrue($builder->has('foo'), '->has() returns true if a service definition exists');
8686
$builder->set('bar', new \stdClass());
8787
$this->assertTrue($builder->has('bar'), '->has() returns true if a service exists');
@@ -259,11 +259,11 @@ public function testAddGetCompilerPass()
259259
public function testCreateService()
260260
{
261261
$builder = new ContainerBuilder();
262-
$builder->register('foo1', 'FooClass')->setFile(__DIR__.'/Fixtures/includes/foo.php');
263-
$this->assertInstanceOf('\FooClass', $builder->get('foo1'), '->createService() requires the file defined by the service definition');
264-
$builder->register('foo2', 'FooClass')->setFile(__DIR__.'/Fixtures/includes/%file%.php');
262+
$builder->register('foo1', 'Bar\FooClass')->setFile(__DIR__.'/Fixtures/includes/foo.php');
263+
$this->assertInstanceOf('\Bar\FooClass', $builder->get('foo1'), '->createService() requires the file defined by the service definition');
264+
$builder->register('foo2', 'Bar\FooClass')->setFile(__DIR__.'/Fixtures/includes/%file%.php');
265265
$builder->setParameter('file', 'foo');
266-
$this->assertInstanceOf('\FooClass', $builder->get('foo2'), '->createService() replaces parameters in the file provided by the service definition');
266+
$this->assertInstanceOf('\Bar\FooClass', $builder->get('foo2'), '->createService() replaces parameters in the file provided by the service definition');
267267
}
268268

269269
/**
@@ -273,13 +273,13 @@ public function testCreateProxyWithRealServiceInstantiator()
273273
{
274274
$builder = new ContainerBuilder();
275275

276-
$builder->register('foo1', 'FooClass')->setFile(__DIR__.'/Fixtures/includes/foo.php');
276+
$builder->register('foo1', 'Bar\FooClass')->setFile(__DIR__.'/Fixtures/includes/foo.php');
277277
$builder->getDefinition('foo1')->setLazy(true);
278278

279279
$foo1 = $builder->get('foo1');
280280

281281
$this->assertSame($foo1, $builder->get('foo1'), 'The same proxy is retrieved on multiple subsequent calls');
282-
$this->assertSame('FooClass', get_class($foo1));
282+
$this->assertSame('Bar\FooClass', get_class($foo1));
283283
}
284284

285285
/**
@@ -300,7 +300,7 @@ public function testCreateServiceArguments()
300300
{
301301
$builder = new ContainerBuilder();
302302
$builder->register('bar', 'stdClass');
303-
$builder->register('foo1', 'FooClass')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar'), '%%unescape_it%%'));
303+
$builder->register('foo1', 'Bar\FooClass')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar'), '%%unescape_it%%'));
304304
$builder->setParameter('value', 'bar');
305305
$this->assertEquals(array('foo' => 'bar', 'bar' => 'foo', $builder->get('bar'), '%unescape_it%'), $builder->get('foo1')->arguments, '->createService() replaces parameters and service references in the arguments provided by the service definition');
306306
}
@@ -312,7 +312,7 @@ public function testCreateServiceFactoryMethod()
312312
{
313313
$builder = new ContainerBuilder();
314314
$builder->register('bar', 'stdClass');
315-
$builder->register('foo1', 'FooClass')->setFactoryClass('FooClass')->setFactoryMethod('getInstance')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar')));
315+
$builder->register('foo1', 'Bar\FooClass')->setFactoryClass('Bar\FooClass')->setFactoryMethod('getInstance')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar')));
316316
$builder->setParameter('value', 'bar');
317317
$this->assertTrue($builder->get('foo1')->called, '->createService() calls the factory method to create the service instance');
318318
$this->assertEquals(array('foo' => 'bar', 'bar' => 'foo', $builder->get('bar')), $builder->get('foo1')->arguments, '->createService() passes the arguments to the factory method');
@@ -337,7 +337,7 @@ public function testCreateServiceMethodCalls()
337337
{
338338
$builder = new ContainerBuilder();
339339
$builder->register('bar', 'stdClass');
340-
$builder->register('foo1', 'FooClass')->addMethodCall('setBar', array(array('%value%', new Reference('bar'))));
340+
$builder->register('foo1', 'Bar\FooClass')->addMethodCall('setBar', array(array('%value%', new Reference('bar'))));
341341
$builder->setParameter('value', 'bar');
342342
$this->assertEquals(array('bar', $builder->get('bar')), $builder->get('foo1')->bar, '->createService() replaces the values in the method calls arguments');
343343
}
@@ -348,23 +348,23 @@ public function testCreateServiceMethodCalls()
348348
public function testCreateServiceConfigurator()
349349
{
350350
$builder = new ContainerBuilder();
351-
$builder->register('foo1', 'FooClass')->setConfigurator('sc_configure');
351+
$builder->register('foo1', 'Bar\FooClass')->setConfigurator('sc_configure');
352352
$this->assertTrue($builder->get('foo1')->configured, '->createService() calls the configurator');
353353

354-
$builder->register('foo2', 'FooClass')->setConfigurator(array('%class%', 'configureStatic'));
354+
$builder->register('foo2', 'Bar\FooClass')->setConfigurator(array('%class%', 'configureStatic'));
355355
$builder->setParameter('class', 'BazClass');
356356
$this->assertTrue($builder->get('foo2')->configured, '->createService() calls the configurator');
357357

358358
$builder->register('baz', 'BazClass');
359-
$builder->register('foo3', 'FooClass')->setConfigurator(array(new Reference('baz'), 'configure'));
359+
$builder->register('foo3', 'Bar\FooClass')->setConfigurator(array(new Reference('baz'), 'configure'));
360360
$this->assertTrue($builder->get('foo3')->configured, '->createService() calls the configurator');
361361

362-
$builder->register('foo4', 'FooClass')->setConfigurator('foo');
362+
$builder->register('foo4', 'Bar\FooClass')->setConfigurator('foo');
363363
try {
364364
$builder->get('foo4');
365365
$this->fail('->createService() throws an InvalidArgumentException if the configure callable is not a valid callable');
366366
} catch (\InvalidArgumentException $e) {
367-
$this->assertEquals('The configure callable for class "FooClass" is not a callable.', $e->getMessage(), '->createService() throws an InvalidArgumentException if the configure callable is not a valid callable');
367+
$this->assertEquals('The configure callable for class "Bar\FooClass" is not a callable.', $e->getMessage(), '->createService() throws an InvalidArgumentException if the configure callable is not a valid callable');
368368
}
369369
}
370370

@@ -375,7 +375,7 @@ public function testCreateServiceConfigurator()
375375
public function testCreateSyntheticService()
376376
{
377377
$builder = new ContainerBuilder();
378-
$builder->register('foo', 'FooClass')->setSynthetic(true);
378+
$builder->register('foo', 'Bar\FooClass')->setSynthetic(true);
379379
$builder->get('foo');
380380
}
381381

@@ -384,7 +384,7 @@ public function testCreateServiceWithExpression()
384384
$builder = new ContainerBuilder();
385385
$builder->setParameter('bar', 'bar');
386386
$builder->register('bar', 'BarClass');
387-
$builder->register('foo', 'FooClass')->addArgument(array('foo' => new Expression('service("bar").foo ~ parameter("bar")')));
387+
$builder->register('foo', 'Bar\FooClass')->addArgument(array('foo' => new Expression('service("bar").foo ~ parameter("bar")')));
388388
$this->assertEquals('foobar', $builder->get('foo')->arguments['foo']);
389389
}
390390

@@ -394,7 +394,7 @@ public function testCreateServiceWithExpression()
394394
public function testResolveServices()
395395
{
396396
$builder = new ContainerBuilder();
397-
$builder->register('foo', 'FooClass');
397+
$builder->register('foo', 'Bar\FooClass');
398398
$this->assertEquals($builder->get('foo'), $builder->resolveServices(new Reference('foo')), '->resolveServices() resolves service references to service instances');
399399
$this->assertEquals(array('foo' => array('foo', $builder->get('foo'))), $builder->resolveServices(array('foo' => array('foo', new Reference('foo')))), '->resolveServices() resolves service references to service instances in nested arrays');
400400
$this->assertEquals($builder->get('foo'), $builder->resolveServices(new Expression('service("foo")')), '->resolveServices() resolves expressions');
@@ -427,7 +427,7 @@ public function testMerge()
427427

428428
$container = new ContainerBuilder();
429429
$container->setResourceTracking(false);
430-
$container->register('foo', 'FooClass');
430+
$container->register('foo', 'Bar\FooClass');
431431
$container->register('bar', 'BarClass');
432432
$config = new ContainerBuilder();
433433
$config->setDefinition('baz', new Definition('BazClass'));
@@ -441,7 +441,7 @@ public function testMerge()
441441

442442
$container = new ContainerBuilder();
443443
$container->setResourceTracking(false);
444-
$container->register('foo', 'FooClass');
444+
$container->register('foo', 'Bar\FooClass');
445445
$config->setDefinition('foo', new Definition('BazClass'));
446446
$container->merge($config);
447447
$this->assertEquals('BazClass', $container->getDefinition('foo')->getClass(), '->merge() overrides already defined services');
@@ -466,7 +466,7 @@ public function testfindTaggedServiceIds()
466466
{
467467
$builder = new ContainerBuilder();
468468
$builder
469-
->register('foo', 'FooClass')
469+
->register('foo', 'Bar\FooClass')
470470
->addTag('foo', array('foo' => 'foo'))
471471
->addTag('bar', array('bar' => 'bar'))
472472
->addTag('foo', array('foofoo' => 'foofoo'))
@@ -486,7 +486,7 @@ public function testfindTaggedServiceIds()
486486
public function testFindDefinition()
487487
{
488488
$container = new ContainerBuilder();
489-
$container->setDefinition('foo', $definition = new Definition('FooClass'));
489+
$container->setDefinition('foo', $definition = new Definition('Bar\FooClass'));
490490
$container->setAlias('bar', 'foo');
491491
$container->setAlias('foobar', 'bar');
492492
$this->assertEquals($definition, $container->findDefinition('foobar'), '->findDefinition() returns a Definition');

src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010

1111
$container = new ContainerBuilder();
1212
$container->
13-
register('foo', 'FooClass')->
13+
register('foo', 'Bar\FooClass')->
1414
addTag('foo', array('foo' => 'foo'))->
1515
addTag('foo', array('bar' => 'bar'))->
16-
setFactoryClass('FooClass')->
16+
setFactoryClass('Bar\\FooClass')->
1717
setFactoryMethod('getInstance')->
1818
setArguments(array('foo', new Reference('foo.baz'), array('%foo%' => 'foo is %foo%', 'foobar' => '%foo%'), true, new Reference('service_container')))->
1919
setProperties(array('foo' => 'bar', 'moo' => new Reference('foo.baz')))->
@@ -22,7 +22,7 @@
2222
setConfigurator('sc_configure')
2323
;
2424
$container->
25-
register('bar', 'FooClass')->
25+
register('bar', 'Bar\FooClass')->
2626
setArguments(array('foo', new Reference('foo.baz'), new Parameter('foo_bar')))->
2727
setScope('container')->
2828
setConfigurator(array(new Reference('foo.baz'), 'configure'))
@@ -40,13 +40,13 @@
4040
$container->getParameterBag()->clear();
4141
$container->getParameterBag()->add(array(
4242
'baz_class' => 'BazClass',
43-
'foo_class' => 'FooClass',
43+
'foo_class' => 'Bar\FooClass',
4444
'foo' => 'bar',
4545
));
4646
$container->setAlias('alias_for_foo', 'foo');
4747
$container->setAlias('alias_for_alias', 'alias_for_foo');
4848
$container->
49-
register('method_call1', 'FooClass')->
49+
register('method_call1', 'Bar\FooClass')->
5050
setFile(realpath(__DIR__.'/../includes/foo.php'))->
5151
addMethodCall('setBar', array(new Reference('foo')))->
5252
addMethodCall('setBar', array(new Reference('foo2', ContainerInterface::NULL_ON_INVALID_REFERENCE)))->

src/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ digraph sc {
33
node [fontsize="11" fontname="Arial" shape="record"];
44
edge [fontsize="9" fontname="Arial" color="grey" arrowhead="open" arrowsize="0.5"];
55

6-
node_foo [label="foo (alias_for_foo)\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
7-
node_bar [label="bar\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
6+
node_foo [label="foo (alias_for_foo)\nBar\\FooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
7+
node_bar [label="bar\nBar\\FooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
88
node_foo_baz [label="foo.baz\nBazClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
9-
node_foo_bar [label="foo_bar\nFooClass\n", shape=record, fillcolor="#eeeeee", style="dotted"];
10-
node_method_call1 [label="method_call1\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
9+
node_foo_bar [label="foo_bar\nBar\\FooClass\n", shape=record, fillcolor="#eeeeee", style="dotted"];
10+
node_method_call1 [label="method_call1\nBar\\FooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
1111
node_factory_service [label="factory_service\nBar\n", shape=record, fillcolor="#eeeeee", style="filled"];
1212
node_foo_with_inline [label="foo_with_inline\nFoo\n", shape=record, fillcolor="#eeeeee", style="filled"];
1313
node_inlined [label="inlined\nBar\n", shape=record, fillcolor="#eeeeee", style="filled"];

src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/foo.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?php
22

3+
namespace Bar;
4+
35
class FooClass
46
{
57
public $foo, $moo;

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@ public function __construct()
4949
* This service is shared.
5050
* This method always returns the same instance of the service.
5151
*
52-
* @return FooClass A FooClass instance.
52+
* @return Bar\FooClass A Bar\FooClass instance.
5353
*/
5454
protected function getBarService()
5555
{
5656
$a = $this->get('foo.baz');
5757

58-
$this->services['bar'] = $instance = new \FooClass('foo', $a, $this->getParameter('foo_bar'));
58+
$this->services['bar'] = $instance = new \Bar\FooClass('foo', $a, $this->getParameter('foo_bar'));
5959

6060
$a->configure($instance);
6161

@@ -132,13 +132,13 @@ protected function getFactoryServiceService()
132132
* This service is shared.
133133
* This method always returns the same instance of the service.
134134
*
135-
* @return FooClass A FooClass instance.
135+
* @return Bar\FooClass A Bar\FooClass instance.
136136
*/
137137
protected function getFooService()
138138
{
139139
$a = $this->get('foo.baz');
140140

141-
$this->services['foo'] = $instance = \FooClass::getInstance('foo', $a, array($this->getParameter('foo') => 'foo is '.$this->getParameter('foo').'', 'foobar' => $this->getParameter('foo')), true, $this);
141+
$this->services['foo'] = $instance = \Bar\FooClass::getInstance('foo', $a, array($this->getParameter('foo') => 'foo is '.$this->getParameter('foo').'', 'foobar' => $this->getParameter('foo')), true, $this);
142142

143143
$instance->setBar($this->get('bar'));
144144
$instance->initialize();
@@ -201,13 +201,13 @@ protected function getFooWithInlineService()
201201
* This service is shared.
202202
* This method always returns the same instance of the service.
203203
*
204-
* @return FooClass A FooClass instance.
204+
* @return Bar\FooClass A Bar\FooClass instance.
205205
*/
206206
protected function getMethodCall1Service()
207207
{
208208
require_once '%path%foo.php';
209209

210-
$this->services['method_call1'] = $instance = new \FooClass();
210+
$this->services['method_call1'] = $instance = new \Bar\FooClass();
211211

212212
$instance->setBar($this->get('foo'));
213213
$instance->setBar($this->get('foo2', ContainerInterface::NULL_ON_INVALID_REFERENCE));
@@ -297,7 +297,7 @@ protected function getDefaultParameters()
297297
{
298298
return array(
299299
'baz_class' => 'BazClass',
300-
'foo_class' => 'FooClass',
300+
'foo_class' => 'Bar\\FooClass',
301301
'foo' => 'bar',
302302
);
303303
}

0 commit comments

Comments
 (0)
0