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
153
154
155
156
157
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Mvc\Service;
use Interop\Container\ContainerInterface;
use Zend\Router\RouteMatch;
use Zend\ServiceManager\Exception\ServiceNotCreatedException;
use Zend\View\Helper as ViewHelper;
use Zend\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
* @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('zendviewhelperurl', $urlFactory);
// Configure base path helper
$basePathFactory = $this->createBasePathHelperFactory($services);
$plugins->setFactory(ViewHelper\BasePath::class, $basePathFactory);
$plugins->setFactory('zendviewhelperbasepath', $basePathFactory);
// Configure doctype view helper
$doctypeFactory = $this->createDoctypeHelperFactory($services);
$plugins->setFactory(ViewHelper\Doctype::class, $doctypeFactory);
$plugins->setFactory('zendviewhelperdoctype', $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;
};
}
}