Skip to content
This repository was archived by the owner on Feb 6, 2020. It is now read-only.

Commit 972b03b

Browse files
committed
Merge branch 'feature/reflection-factory' into develop
Close #153
2 parents c421e74 + 1204ec9 commit 972b03b

23 files changed

+1152
-21
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ All notable changes to this project will be documented in this file, in reverse
2222
`Zend\ServiceManager\Tool\FactoryCreator`, which will introspect a given class
2323
and generate a factory for it. It also adds a vendor binary,
2424
`generate-factory-for-class`, for generating these from the command line.
25+
- [#153](https://github.com/zendframework/zend-servicemanager/pull/153) adds
26+
`Zend\ServiceManager\AbstractFactory\ReflectionBasedAbstractFactory`. This
27+
class may be used as either a mapped factory or an abstract factory, and will
28+
use reflection in order to determine which dependencies to use from the
29+
container when instantiating the requested service, with the following rules:
30+
- Scalar values are not allowed, unless they have default values associated.
31+
- Values named `$config` type-hinted against `array` will be injected with the
32+
`config` service, if present.
33+
- All other array values will be provided an empty array.
34+
- Class/interface typehints will be pulled from the container.
2535

2636
### Deprecated
2737

benchmarks/BenchAsset/Dependency.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
/**
3+
* @link http://github.com/zendframework/zend-servicemanager for the canonical source repository
4+
* @copyright Copyright (c) 2016 Zend Technologies USA Inc. (http://www.zend.com)
5+
* @license http://framework.zend.com/license/new-bsd New BSD License
6+
*/
7+
8+
namespace ZendBench\ServiceManager\BenchAsset;
9+
10+
class Dependency
11+
{
12+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
/**
3+
* @link http://github.com/zendframework/zend-servicemanager for the canonical source repository
4+
* @copyright Copyright (c) 2016 Zend Technologies USA Inc. (http://www.zend.com)
5+
* @license http://framework.zend.com/license/new-bsd New BSD License
6+
*/
7+
8+
namespace ZendBench\ServiceManager\BenchAsset;
9+
10+
class ServiceDependingOnConfig
11+
{
12+
/**
13+
* @var array
14+
*/
15+
private $config;
16+
17+
public function __construct(array $config)
18+
{
19+
$this->config = $config;
20+
}
21+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
/**
3+
* @link http://github.com/zendframework/zend-servicemanager for the canonical source repository
4+
* @copyright Copyright (c) 2016 Zend Technologies USA Inc. (http://www.zend.com)
5+
* @license http://framework.zend.com/license/new-bsd New BSD License
6+
*/
7+
8+
namespace ZendBench\ServiceManager\BenchAsset;
9+
10+
class ServiceWithDependency
11+
{
12+
/**
13+
* @var Dependency
14+
*/
15+
private $dependency;
16+
17+
/**
18+
* @param Dependency $dependency
19+
*/
20+
public function __construct(Dependency $dependency)
21+
{
22+
$this->dependency = $dependency;
23+
}
24+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
/**
3+
* @link http://github.com/zendframework/zend-servicemanager for the canonical source repository
4+
* @copyright Copyright (c) 2016 Zend Technologies USA Inc. (http://www.zend.com)
5+
* @license http://framework.zend.com/license/new-bsd New BSD License
6+
*/
7+
8+
namespace ZendBench\ServiceManager;
9+
10+
use PhpBench\Benchmark\Metadata\Annotations\Iterations;
11+
use PhpBench\Benchmark\Metadata\Annotations\Revs;
12+
use PhpBench\Benchmark\Metadata\Annotations\Warmup;
13+
use Zend\ServiceManager\AbstractFactory\ConfigAbstractFactory;
14+
use Zend\ServiceManager\ServiceManager;
15+
16+
/**
17+
* @Revs(1000)
18+
* @Iterations(10)
19+
* @Warmup(2)
20+
*/
21+
class FetchNewServiceUsingConfigAbstractFactoryAsFactoryBench
22+
{
23+
/**
24+
* @var ServiceManager
25+
*/
26+
private $sm;
27+
28+
public function __construct()
29+
{
30+
$this->sm = new ServiceManager([
31+
'services' => [
32+
'config' => [
33+
ConfigAbstractFactory::class => [
34+
BenchAsset\Dependency::class => [],
35+
BenchAsset\ServiceWithDependency::class => [
36+
BenchAsset\Dependency::class,
37+
],
38+
BenchAsset\ServiceDependingOnConfig::class => [
39+
'config',
40+
],
41+
],
42+
],
43+
],
44+
'factories' => [
45+
BenchAsset\Dependency::class => ConfigAbstractFactory::class,
46+
BenchAsset\ServiceWithDependency::class => ConfigAbstractFactory::class,
47+
BenchAsset\ServiceDependingOnConfig::class => ConfigAbstractFactory::class,
48+
],
49+
]);
50+
}
51+
52+
public function benchFetchServiceWithNoDependencies()
53+
{
54+
$sm = clone $this->sm;
55+
56+
$sm->get(BenchAsset\Dependency::class);
57+
}
58+
59+
public function benchBuildServiceWithNoDependencies()
60+
{
61+
$sm = clone $this->sm;
62+
63+
$sm->build(BenchAsset\Dependency::class);
64+
}
65+
66+
public function benchFetchServiceDependingOnConfig()
67+
{
68+
$sm = clone $this->sm;
69+
70+
$sm->get(BenchAsset\ServiceDependingOnConfig::class);
71+
}
72+
73+
public function benchBuildServiceDependingOnConfig()
74+
{
75+
$sm = clone $this->sm;
76+
77+
$sm->build(BenchAsset\ServiceDependingOnConfig::class);
78+
}
79+
80+
public function benchFetchServiceWithDependency()
81+
{
82+
$sm = clone $this->sm;
83+
84+
$sm->get(BenchAsset\ServiceWithDependency::class);
85+
}
86+
87+
public function benchBuildServiceWithDependency()
88+
{
89+
$sm = clone $this->sm;
90+
91+
$sm->build(BenchAsset\ServiceWithDependency::class);
92+
}
93+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
/**
3+
* @link http://github.com/zendframework/zend-servicemanager for the canonical source repository
4+
* @copyright Copyright (c) 2016 Zend Technologies USA Inc. (http://www.zend.com)
5+
* @license http://framework.zend.com/license/new-bsd New BSD License
6+
*/
7+
8+
namespace ZendBench\ServiceManager;
9+
10+
use PhpBench\Benchmark\Metadata\Annotations\Iterations;
11+
use PhpBench\Benchmark\Metadata\Annotations\Revs;
12+
use PhpBench\Benchmark\Metadata\Annotations\Warmup;
13+
use Zend\ServiceManager\AbstractFactory\ReflectionBasedAbstractFactory;
14+
use Zend\ServiceManager\ServiceManager;
15+
16+
/**
17+
* @Revs(1000)
18+
* @Iterations(10)
19+
* @Warmup(2)
20+
*/
21+
class FetchNewServiceUsingReflectionAbstractFactoryAsFactoryBench
22+
{
23+
/**
24+
* @var ServiceManager
25+
*/
26+
private $sm;
27+
28+
public function __construct()
29+
{
30+
$this->sm = new ServiceManager([
31+
'services' => [
32+
'config' => [],
33+
],
34+
'factories' => [
35+
BenchAsset\Dependency::class => ReflectionBasedAbstractFactory::class,
36+
BenchAsset\ServiceWithDependency::class => ReflectionBasedAbstractFactory::class,
37+
BenchAsset\ServiceDependingOnConfig::class => ReflectionBasedAbstractFactory::class,
38+
],
39+
]);
40+
}
41+
42+
public function benchFetchServiceWithNoDependencies()
43+
{
44+
$sm = clone $this->sm;
45+
46+
$sm->get(BenchAsset\Dependency::class);
47+
}
48+
49+
public function benchBuildServiceWithNoDependencies()
50+
{
51+
$sm = clone $this->sm;
52+
53+
$sm->build(BenchAsset\Dependency::class);
54+
}
55+
56+
public function benchFetchServiceDependingOnConfig()
57+
{
58+
$sm = clone $this->sm;
59+
60+
$sm->get(BenchAsset\ServiceDependingOnConfig::class);
61+
}
62+
63+
public function benchBuildServiceDependingOnConfig()
64+
{
65+
$sm = clone $this->sm;
66+
67+
$sm->build(BenchAsset\ServiceDependingOnConfig::class);
68+
}
69+
70+
public function benchFetchServiceWithDependency()
71+
{
72+
$sm = clone $this->sm;
73+
74+
$sm->get(BenchAsset\ServiceWithDependency::class);
75+
}
76+
77+
public function benchBuildServiceWithDependency()
78+
{
79+
$sm = clone $this->sm;
80+
81+
$sm->build(BenchAsset\ServiceWithDependency::class);
82+
}
83+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
/**
3+
* @link http://github.com/zendframework/zend-servicemanager for the canonical source repository
4+
* @copyright Copyright (c) 2016 Zend Technologies USA Inc. (http://www.zend.com)
5+
* @license http://framework.zend.com/license/new-bsd New BSD License
6+
*/
7+
8+
namespace ZendBench\ServiceManager;
9+
10+
use PhpBench\Benchmark\Metadata\Annotations\Iterations;
11+
use PhpBench\Benchmark\Metadata\Annotations\Revs;
12+
use PhpBench\Benchmark\Metadata\Annotations\Warmup;
13+
use Zend\ServiceManager\AbstractFactory\ConfigAbstractFactory;
14+
use Zend\ServiceManager\ServiceManager;
15+
16+
/**
17+
* @Revs(1000)
18+
* @Iterations(10)
19+
* @Warmup(2)
20+
*/
21+
class FetchNewServiceViaConfigAbstractFactoryBench
22+
{
23+
/**
24+
* @var ServiceManager
25+
*/
26+
private $sm;
27+
28+
public function __construct()
29+
{
30+
$this->sm = new ServiceManager([
31+
'services' => [
32+
'config' => [
33+
ConfigAbstractFactory::class => [
34+
BenchAsset\Dependency::class => [],
35+
BenchAsset\ServiceWithDependency::class => [
36+
BenchAsset\Dependency::class,
37+
],
38+
BenchAsset\ServiceDependingOnConfig::class => [
39+
'config',
40+
],
41+
],
42+
],
43+
],
44+
'abstract_factories' => [
45+
ConfigAbstractFactory::class,
46+
],
47+
]);
48+
}
49+
50+
public function benchFetchServiceWithNoDependencies()
51+
{
52+
$sm = clone $this->sm;
53+
54+
$sm->get(BenchAsset\Dependency::class);
55+
}
56+
57+
public function benchBuildServiceWithNoDependencies()
58+
{
59+
$sm = clone $this->sm;
60+
61+
$sm->build(BenchAsset\Dependency::class);
62+
}
63+
64+
public function benchFetchServiceDependingOnConfig()
65+
{
66+
$sm = clone $this->sm;
67+
68+
$sm->get(BenchAsset\ServiceDependingOnConfig::class);
69+
}
70+
71+
public function benchBuildServiceDependingOnConfig()
72+
{
73+
$sm = clone $this->sm;
74+
75+
$sm->build(BenchAsset\ServiceDependingOnConfig::class);
76+
}
77+
78+
public function benchFetchServiceWithDependency()
79+
{
80+
$sm = clone $this->sm;
81+
82+
$sm->get(BenchAsset\ServiceWithDependency::class);
83+
}
84+
85+
public function benchBuildServiceWithDependency()
86+
{
87+
$sm = clone $this->sm;
88+
89+
$sm->build(BenchAsset\ServiceWithDependency::class);
90+
}
91+
}

0 commit comments

Comments
 (0)