-
-
Notifications
You must be signed in to change notification settings - Fork 53
/
ViewHelperManagerFactory.php
152 lines (131 loc) · 5.09 KB
/
ViewHelperManagerFactory.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?php
namespace Laminas\Mvc\Service;
use Interop\Container\ContainerInterface;
use Laminas\Router\RouteMatch;
use Laminas\ServiceManager\Exception\ServiceNotCreatedException;
use Laminas\View\Helper as ViewHelper;
use Laminas\View\HelperPluginManager;
class ViewHelperManagerFactory extends AbstractPluginManagerFactory
{
const PLUGIN_MANAGER_CLASS = HelperPluginManager::class;
/**
* An array of helper configuration classes to ensure are on the helper_map stack.
*
* These are *not* imported; that way they can be optional dependencies.
*
* @todo Remove these once their components have Modules defined.
* @var array
*/
protected $defaultHelperMapClasses = [];
/**
* Create and return the view helper manager
*
* @param ContainerInterface $container
* @param string $requestedName
* @param null|array $options
* @return HelperPluginManager
* @throws ServiceNotCreatedException
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$options = $options ?: [];
$options['factories'] = isset($options['factories']) ? $options['factories'] : [];
$plugins = parent::__invoke($container, $requestedName, $options);
// Override plugin factories
$plugins = $this->injectOverrideFactories($plugins, $container);
return $plugins;
}
/**
* Inject override factories into the plugin manager.
*
* @param HelperPluginManager $plugins
* @param ContainerInterface $services
* @return HelperPluginManager
*/
private function injectOverrideFactories(HelperPluginManager $plugins, ContainerInterface $services)
{
// Configure URL view helper
$urlFactory = $this->createUrlHelperFactory($services);
$plugins->setFactory(ViewHelper\Url::class, $urlFactory);
$plugins->setFactory('laminasviewhelperurl', $urlFactory);
// Configure base path helper
$basePathFactory = $this->createBasePathHelperFactory($services);
$plugins->setFactory(ViewHelper\BasePath::class, $basePathFactory);
$plugins->setFactory('laminasviewhelperbasepath', $basePathFactory);
// Configure doctype view helper
$doctypeFactory = $this->createDoctypeHelperFactory($services);
$plugins->setFactory(ViewHelper\Doctype::class, $doctypeFactory);
$plugins->setFactory('laminasviewhelperdoctype', $doctypeFactory);
return $plugins;
}
/**
* Create and return a factory for creating a URL helper.
*
* Retrieves the application and router from the servicemanager,
* and the route match from the MvcEvent composed by the application,
* using them to configure the helper.
*
* @param ContainerInterface $services
* @return callable
*/
private function createUrlHelperFactory(ContainerInterface $services)
{
return function () use ($services) {
$helper = new ViewHelper\Url;
$helper->setRouter($services->get('HttpRouter'));
$match = $services->get('Application')
->getMvcEvent()
->getRouteMatch()
;
if ($match instanceof RouteMatch) {
$helper->setRouteMatch($match);
}
return $helper;
};
}
/**
* Create and return a factory for creating a BasePath helper.
*
* Uses configuration and request services to configure the helper.
*
* @param ContainerInterface $services
* @return callable
*/
private function createBasePathHelperFactory(ContainerInterface $services)
{
return function () use ($services) {
$config = $services->has('config') ? $services->get('config') : [];
$helper = new ViewHelper\BasePath;
if (isset($config['view_manager']) && isset($config['view_manager']['base_path'])) {
$helper->setBasePath($config['view_manager']['base_path']);
return $helper;
}
$request = $services->get('Request');
if (is_callable([$request, 'getBasePath'])) {
$helper->setBasePath($request->getBasePath());
}
return $helper;
};
}
/**
* Create and return a Doctype helper factory.
*
* Other view helpers depend on this to decide which spec to generate their tags
* based on. This is why it must be set early instead of later in the layout phtml.
*
* @param ContainerInterface $services
* @return callable
*/
private function createDoctypeHelperFactory(ContainerInterface $services)
{
return function () use ($services) {
$config = $services->has('config') ? $services->get('config') : [];
$config = isset($config['view_manager']) ? $config['view_manager'] : [];
$helper = new ViewHelper\Doctype;
if (isset($config['doctype']) && $config['doctype']) {
$helper->setDoctype($config['doctype']);
}
return $helper;
};
}
}