Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 8d067ba

Browse filesBrowse files
committed
[DepedencyInjection] amended previous commit
* fixed coding standards * made class optional as it is not defined when using a factory service * renamed factory attributes in XML files, updated XSD * removed the factory-class as it does nothing more than the regular class attribute * moved usage of Reflection as 'class' is not defined when a factory-service is used * added more tests * fixed PHP dumper
1 parent ef91396 commit 8d067ba
Copy full SHA for 8d067ba

File tree

Expand file treeCollapse file tree

20 files changed

+91
-123
lines changed
Filter options
Expand file treeCollapse file tree

20 files changed

+91
-123
lines changed

‎src/Symfony/Components/DependencyInjection/Builder.php

Copy file name to clipboardExpand all lines: src/Symfony/Components/DependencyInjection/Builder.php
+7-8Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ public function getAlias($id)
232232
*
233233
* @return Definition A Definition instance
234234
*/
235-
public function register($id, $class)
235+
public function register($id, $class = null)
236236
{
237237
return $this->setDefinition($id, new Definition($class));
238238
}
@@ -329,20 +329,19 @@ protected function createService(Definition $definition, $id)
329329
require_once self::resolveValue($definition->getFile(), $this->getParameterBag()->all());
330330
}
331331

332-
$r = new \ReflectionClass(self::resolveValue($definition->getClass(), $this->getParameterBag()->all()));
333-
334332
$arguments = $this->resolveServices(self::resolveValue($definition->getArguments(), $this->getParameterBag()->all()));
335333

336334
if (null !== $definition->getFactoryMethod()) {
337335
if (null !== $definition->getFactoryService()) {
338-
$factoryService = $this->get(self::resolveValue($definition->getFactoryService(), $this->getParameterBag()->all()));
339-
$service = call_user_func_array(array($factoryService, $definition->getFactoryMethod()), $arguments);
340-
} else if(null !== $definition->getFactoryClass()) {
341-
$service = call_user_func_array(array(self::resolveValue($definition->getFactoryClass(), $this->getParameterBag()->all()), $definition->getFactoryMethod()), $arguments);
336+
$factory = $this->get(self::resolveValue($definition->getFactoryService(), $this->getParameterBag()->all()));
342337
} else {
343-
$service = call_user_func_array(array(self::resolveValue($definition->getClass(), $this->getParameterBag()->all()), $definition->getFactoryMethod()), $arguments);
338+
$factory = self::resolveValue($definition->getClass(), $this->getParameterBag()->all());
344339
}
340+
341+
$service = call_user_func_array(array($factory, $definition->getFactoryMethod()), $arguments);
345342
} else {
343+
$r = new \ReflectionClass(self::resolveValue($definition->getClass(), $this->getParameterBag()->all()));
344+
346345
$service = null === $r->getConstructor() ? $r->newInstance() : $r->newInstanceArgs($arguments);
347346
}
348347

‎src/Symfony/Components/DependencyInjection/Definition.php

Copy file name to clipboardExpand all lines: src/Symfony/Components/DependencyInjection/Definition.php
+9-27Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class Definition
2424
protected $file;
2525
protected $factoryMethod;
2626
protected $factoryService;
27-
protected $factoryClass;
2827
protected $shared;
2928
protected $arguments;
3029
protected $calls;
@@ -37,7 +36,7 @@ class Definition
3736
* @param string $class The service class
3837
* @param array $arguments An array of arguments to pass to the service constructor
3938
*/
40-
public function __construct($class, array $arguments = array())
39+
public function __construct($class = null, array $arguments = array())
4140
{
4241
$this->class = $class;
4342
$this->arguments = $arguments;
@@ -71,44 +70,27 @@ public function getFactoryMethod()
7170
}
7271

7372
/**
74-
* Set the name of the service that acts as a factory using the specified `constructor` method.
73+
* Sets the name of the service that acts as a factory using the constructor method.
7574
*
76-
* @param string
75+
* @param string $factoryService The factory service id
76+
*
77+
* @return Definition The current instance
7778
*/
7879
public function setFactoryService($factoryService)
7980
{
8081
$this->factoryService = $factoryService;
81-
return $this;
82-
}
8382

84-
/**
85-
* @return string
86-
*/
87-
public function getFactoryService()
88-
{
89-
return $this->factoryService;
90-
}
91-
92-
/**
93-
* If service has a constructor method but no factory service, this class is the static callback.
94-
*
95-
* @param string $factoryClass
96-
* @return Definition
97-
*/
98-
public function setFactoryClass($factoryClass)
99-
{
100-
$this->factoryClass = $factoryClass;
10183
return $this;
10284
}
10385

10486
/**
105-
* Get the current static create class for this service.
87+
* Gets the factory service id.
10688
*
107-
* @return string
89+
* @return string The factory service id
10890
*/
109-
public function getFactoryClass()
91+
public function getFactoryService()
11092
{
111-
return $this->factoryClass;
93+
return $this->factoryService;
11294
}
11395

11496
/**

‎src/Symfony/Components/DependencyInjection/Dumper/PhpDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Components/DependencyInjection/Dumper/PhpDumper.php
+9-6Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,7 @@ protected function addServiceInstance($id, $definition)
9494

9595
if (null !== $definition->getFactoryMethod()) {
9696
if (null !== $definition->getFactoryService()) {
97-
$code = sprintf(" \$instance = \$this->get%sService()->%s(%s);\n", $this->dumpValue($definition->getFactoryService()), $definition->getFactoryMethod(), implode(', ', $arguments));
98-
} elseif (null !== $definition->getFactoryClass()) {
99-
$code = sprintf(" \$instance = call_user_func(array(%s, '%s')%s);\n", $this->dumpValue($definition->getFactoryClass()), $definition->getFactoryMethod(), $arguments ? ', '.implode(', ', $arguments) : '');
97+
$code = sprintf(" \$instance = %s->%s(%s);\n", $this->getServiceCall($definition->getFactoryService()), $definition->getFactoryMethod(), implode(', ', $arguments));
10098
} else {
10199
$code = sprintf(" \$instance = call_user_func(array(%s, '%s')%s);\n", $class, $definition->getFactoryMethod(), $arguments ? ', '.implode(', ', $arguments) : '');
102100
}
@@ -148,8 +146,13 @@ protected function addServiceConfigurator($id, $definition)
148146
protected function addService($id, $definition)
149147
{
150148
$name = Container::camelize($id);
151-
$class = $definition->getClass();
152-
$type = 0 === strpos($class, '%') ? 'Object' : $class;
149+
150+
$return = '';
151+
if ($class = $definition->getClass()) {
152+
$return = sprintf("@return %s A %s instance.", 0 === strpos($class, '%') ? 'Object' : $class, $class);
153+
} elseif ($definition->getFactoryService()) {
154+
$return = sprintf('@return Object An instance returned by %s::%s().', $definition->getFactoryService(), $definition->getFactoryMethod());
155+
}
153156

154157
$doc = '';
155158
if ($definition->isShared()) {
@@ -166,7 +169,7 @@ protected function addService($id, $definition)
166169
/**
167170
* Gets the '$id' service.$doc
168171
*
169-
* @return $type A $class instance.
172+
* $return
170173
*/
171174
protected function get{$name}Service()
172175
{

‎src/Symfony/Components/DependencyInjection/Dumper/XmlDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Components/DependencyInjection/Dumper/XmlDumper.php
+3-4Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,11 @@ protected function addParameters()
4747

4848
protected function addService($id, $definition)
4949
{
50-
$code = sprintf(" <service id=\"%s\" class=\"%s\"%s%s%s%s>\n",
50+
$code = sprintf(" <service id=\"%s\"%s%s%s%s>\n",
5151
$id,
52-
$definition->getClass(),
52+
$definition->getClass() ? sprintf(' class="%s"', $definition->getClass()) : '',
5353
$definition->getFactoryMethod() ? sprintf(' factory-method="%s"', $definition->getFactoryMethod()) : '',
54-
$definition->getFactoryClass() ? sprintf(' factoryclass="%s"', $definition->getFactoryClass()) : '',
55-
$definition->getFactoryService() ? sprintf(' constructor="%s"', $definition->getFactoryService()) : '',
54+
$definition->getFactoryService() ? sprintf(' factory-service="%s"', $definition->getFactoryService()) : '',
5655
!$definition->isShared() ? ' shared="false"' : ''
5756
);
5857

‎src/Symfony/Components/DependencyInjection/Dumper/YamlDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Components/DependencyInjection/Dumper/YamlDumper.php
+4-6Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ public function dump(array $options = array())
4040
protected function addService($id, $definition)
4141
{
4242
$code = " $id:\n";
43-
$code .= sprintf(" class: %s\n", $definition->getClass());
43+
if ($definition->getClass()) {
44+
$code .= sprintf(" class: %s\n", $definition->getClass());
45+
}
4446

4547
$annotationsCode = '';
4648
foreach ($definition->getAnnotations() as $name => $annotations) {
@@ -66,12 +68,8 @@ protected function addService($id, $definition)
6668
$code .= sprintf(" factory_method: %s\n", $definition->getFactoryMethod());
6769
}
6870

69-
if ($definition->getFactoryClass()) {
70-
$code .= sprintf(" factoryClass: %s\n", $definition->getFactoryClass());
71-
}
72-
7371
if ($definition->getFactoryService()) {
74-
$code .= sprintf(" factoryService: %s\n", $definition->getFactoryService());
72+
$code .= sprintf(" factory_service: %s\n", $definition->getFactoryService());
7573
}
7674

7775
if ($definition->getArguments()) {

‎src/Symfony/Components/DependencyInjection/Loader/XmlFileLoader.php

Copy file name to clipboardExpand all lines: src/Symfony/Components/DependencyInjection/Loader/XmlFileLoader.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ protected function parseDefinition(BuilderConfiguration $configuration, $id, $se
134134

135135
$definition = new Definition((string) $service['class']);
136136

137-
foreach (array('shared', 'factory-method', 'factoryservice', 'factoryclass') as $key) {
137+
foreach (array('shared', 'factory-method', 'factory-service', 'factory-class') as $key) {
138138
if (isset($service[$key])) {
139139
$method = 'set'.str_replace('-', '', $key);
140140
$definition->$method((string) $service->getAttributeAsPhp($key));

‎src/Symfony/Components/DependencyInjection/Loader/YamlFileLoader.php

Copy file name to clipboardExpand all lines: src/Symfony/Components/DependencyInjection/Loader/YamlFileLoader.php
+7-7Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,11 @@ protected function parseDefinition(BuilderConfiguration $configuration, $id, $se
131131
return;
132132
}
133133

134-
$definition = new Definition($service['class']);
134+
$definition = new Definition();
135+
136+
if (isset($service['class'])) {
137+
$definition->setClass($service['class']);
138+
}
135139

136140
if (isset($service['shared'])) {
137141
$definition->setShared($service['shared']);
@@ -141,12 +145,8 @@ protected function parseDefinition(BuilderConfiguration $configuration, $id, $se
141145
$definition->setFactoryMethod($service['factory_method']);
142146
}
143147

144-
if (isset($service['factoryClass'])) {
145-
$definition->setFactoryClass($service['factoryClass']);
146-
}
147-
148-
if (isset($service['factoryService'])) {
149-
$definition->setFactoryService($service['factoryService']);
148+
if (isset($service['factory_service'])) {
149+
$definition->setFactoryService($service['factory_service']);
150150
}
151151

152152
if (isset($service['file'])) {

‎src/Symfony/Components/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd

Copy file name to clipboardExpand all lines: src/Symfony/Components/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
<xsd:attribute name="class" type="xsd:string" />
9191
<xsd:attribute name="shared" type="boolean" />
9292
<xsd:attribute name="factory-method" type="xsd:string" />
93+
<xsd:attribute name="factory-service" type="xsd:string" />
9394
<xsd:attribute name="alias" type="xsd:string" />
9495
</xsd:complexType>
9596

‎tests/Symfony/Tests/Components/DependencyInjection/BuilderTest.php

Copy file name to clipboardExpand all lines: tests/Symfony/Tests/Components/DependencyInjection/BuilderTest.php
+16-34Lines changed: 16 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,10 @@
1717
use Symfony\Components\DependencyInjection\Reference;
1818
use Symfony\Components\DependencyInjection\ParameterBag\ParameterBag;
1919

20+
require_once __DIR__.'/Fixtures/includes/classes.php';
21+
2022
class BuilderTest extends \PHPUnit_Framework_TestCase
2123
{
22-
static protected $fixturesPath;
23-
24-
static public function setUpBeforeClass()
25-
{
26-
self::$fixturesPath = __DIR__.'/Fixtures/';
27-
}
28-
2924
/**
3025
* @covers Symfony\Components\DependencyInjection\Builder::setDefinitions
3126
* @covers Symfony\Components\DependencyInjection\Builder::getDefinitions
@@ -199,9 +194,9 @@ public function testAddAliases()
199194
public function testCreateService()
200195
{
201196
$builder = new Builder();
202-
$builder->register('foo1', 'FooClass')->setFile(self::$fixturesPath.'/includes/foo.php');
197+
$builder->register('foo1', 'FooClass')->setFile(__DIR__.'/Fixtures/includes/foo.php');
203198
$this->assertInstanceOf('\FooClass', $builder->get('foo1'), '->createService() requires the file defined by the service definition');
204-
$builder->register('foo2', 'FooClass')->setFile(self::$fixturesPath.'/includes/%file%.php');
199+
$builder->register('foo2', 'FooClass')->setFile(__DIR__.'/Fixtures/includes/%file%.php');
205200
$builder->setParameter('file', 'foo');
206201
$this->assertInstanceOf('\FooClass', $builder->get('foo2'), '->createService() replaces parameters in the file provided by the service definition');
207202
}
@@ -242,6 +237,18 @@ public function testCreateServiceFactoryMethod()
242237
$this->assertEquals(array('foo' => 'bar', 'bar' => 'foo', $builder->get('bar')), $builder->get('foo1')->arguments, '->createService() passes the arguments to the factory method');
243238
}
244239

240+
/**
241+
* @covers Symfony\Components\DependencyInjection\Builder::createService
242+
*/
243+
public function testCreateServiceFactoryService()
244+
{
245+
$builder = new Builder();
246+
$builder->register('baz_service')->setFactoryService('baz_factory')->setFactoryMethod('getInstance');
247+
$builder->register('baz_factory', 'BazClass');
248+
249+
$this->assertType('BazClass', $builder->get('baz_service'));
250+
}
251+
245252
/**
246253
* @covers Symfony\Components\DependencyInjection\Builder::createService
247254
*/
@@ -259,8 +266,6 @@ public function testCreateServiceMethodCalls()
259266
*/
260267
public function testCreateServiceConfigurator()
261268
{
262-
require_once self::$fixturesPath.'/includes/classes.php';
263-
264269
$builder = new Builder();
265270
$builder->register('foo1', 'FooClass')->setConfigurator('sc_configure');
266271
$this->assertTrue($builder->get('foo1')->configured, '->createService() calls the configurator');
@@ -394,27 +399,4 @@ public function testFindAnnotatedServiceIds()
394399
), '->findAnnotatedServiceIds() returns an array of service ids and its annotation attributes');
395400
$this->assertEquals(array(), $builder->findAnnotatedServiceIds('foobar'), '->findAnnotatedServiceIds() returns an empty array if there is annotated services');
396401
}
397-
398-
public function testFactories()
399-
{
400-
$def1 = new Definition('BazClass');
401-
$def1->setFactoryClass('BazFactory');
402-
$def1->setConstructor('createStatic');
403-
404-
$def2 = new Definition('BazClass');
405-
$def2->setFactoryService('BazFactoryService');
406-
$def2->setFactoryMethod('create');
407-
408-
$def3 = new Definition('BazFactory');
409-
410-
$builder = new Builder();
411-
$builder->addDefinitions(array(
412-
'baz_factory' => $def1,
413-
'baz_service' => $def2,
414-
'BazFactoryService' => $def3,
415-
));
416-
417-
$this->assertType('BazClass', $builder->get('baz_factory'));
418-
$this->assertType('Bazclass', $builder->get('baz_service'));
419-
}
420402
}

‎tests/Symfony/Tests/Components/DependencyInjection/DefinitionTest.php

Copy file name to clipboardExpand all lines: tests/Symfony/Tests/Components/DependencyInjection/DefinitionTest.php
-7Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,6 @@ public function testSetGetConstructor()
3737
$this->assertEquals('foo', $def->getFactoryMethod(), '->getFactoryMethod() returns the factory method name');
3838
}
3939

40-
public function testSetGetFactoryClass()
41-
{
42-
$def = new Definition('stdClass');
43-
$this->assertSame($def, $def->setFactoryClass('stdClass2'), "->setFactoryClass() implements a fluent interface.");
44-
$this->assertEquals('stdClass2', $def->getFactoryClass(), 'Overwrite default factory class method did not work.');
45-
}
46-
4740
public function testSetGetFactoryService()
4841
{
4942
$def = new Definition('stdClass');

‎tests/Symfony/Tests/Components/DependencyInjection/Fixtures/containers/container9.php

Copy file name to clipboardExpand all lines: tests/Symfony/Tests/Components/DependencyInjection/Fixtures/containers/container9.php
+5Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,10 @@
4646
addMethodCall('setBar', array(new Reference('foo', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))->
4747
addMethodCall('setBar', array(new Reference('foobaz', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))
4848
;
49+
$container->
50+
register('factory_service')->
51+
setFactoryService('foo.baz')->
52+
setFactoryMethod('getInstance')
53+
;
4954

5055
return $container;

‎tests/Symfony/Tests/Components/DependencyInjection/Fixtures/graphviz/services9.dot

Copy file name to clipboardExpand all lines: tests/Symfony/Tests/Components/DependencyInjection/Fixtures/graphviz/services9.dot
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ digraph sc {
88
node_foo_baz [label="foo.baz\nBazClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
99
node_foo_bar [label="foo_bar\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
1010
node_method_call1 [label="method_call1\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
11+
node_factory_service [label="factory_service\n\n", shape=record, fillcolor="#eeeeee", style="filled"];
1112
node_service_container [label="service_container\nSymfony\\Components\\DependencyInjection\\Builder\n", shape=record, fillcolor="#9999ff", style="filled"];
1213
node_foobaz [label="foobaz\n\n", shape=record, fillcolor="#ff9999", style="filled"];
1314
node_foo -> node_foo_baz [label="" style="filled"];

‎tests/Symfony/Tests/Components/DependencyInjection/Fixtures/includes/classes.php

Copy file name to clipboardExpand all lines: tests/Symfony/Tests/Components/DependencyInjection/Fixtures/includes/classes.php
-13Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,3 @@ static public function configureStatic1()
3030
{
3131
}
3232
}
33-
34-
class BazFactory
35-
{
36-
static public function createStatic()
37-
{
38-
return new BazClass();
39-
}
40-
41-
public function create()
42-
{
43-
return new BazClass();
44-
}
45-
}

‎tests/Symfony/Tests/Components/DependencyInjection/Fixtures/php/services9.php

Copy file name to clipboardExpand all lines: tests/Symfony/Tests/Components/DependencyInjection/Fixtures/php/services9.php
+18Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,24 @@ protected function getMethodCall1Service()
124124
return $instance;
125125
}
126126

127+
/**
128+
* Gets the 'factory_service' service.
129+
*
130+
* This service is shared.
131+
* This method always returns the same instance of the service.
132+
*
133+
* @return Object An instance returned by foo.baz::getInstance().
134+
*/
135+
protected function getFactoryServiceService()
136+
{
137+
if (isset($this->shared['factory_service'])) return $this->shared['factory_service'];
138+
139+
$instance = $this->getFoo_BazService()->getInstance();
140+
$this->shared['factory_service'] = $instance;
141+
142+
return $instance;
143+
}
144+
127145
/**
128146
* Gets the alias_for_foo service alias.
129147
*

‎tests/Symfony/Tests/Components/DependencyInjection/Fixtures/xml/services6.xml

Copy file name to clipboardExpand all lines: tests/Symfony/Tests/Components/DependencyInjection/Fixtures/xml/services6.xml
+1-3Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@
4343
</call>
4444
</service>
4545
<service id="alias_for_foo" alias="foo" />
46-
47-
<service id="factory_class" constructor="createStatic" factoryclass="BazFactory" />
48-
<service id="factory_service" constructor="create" factoryservice="BazFactoryService" />
46+
<service id="factory_service" factory-method="getInstance" factory-service="baz_factory" />
4947
</services>
5048
</container>

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.