1: <?php
2:
3: namespace Charcoal\View;
4:
5:
6: use Pimple\ServiceProviderInterface;
7: use Pimple\Container;
8:
9:
10: use Charcoal\View\GenericView;
11: use Charcoal\View\Mustache\MustacheEngine;
12: use Charcoal\View\Mustache\MustacheLoader;
13: use Charcoal\View\Mustache\AssetsHelpers;
14: use Charcoal\View\Mustache\TranslatorHelpers;
15: use Charcoal\View\Php\PhpEngine;
16: use Charcoal\View\Php\PhpLoader;
17: use Charcoal\View\Twig\TwigEngine;
18: use Charcoal\View\Twig\TwigLoader;
19: use Charcoal\View\Renderer;
20: use Charcoal\View\ViewConfig;
21: use Charcoal\View\ViewInterface;
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: class ViewServiceProvider implements ServiceProviderInterface
51: {
52: 53: 54: 55: 56: 57: 58: 59: 60:
61: public function register(Container $container)
62: {
63: $this->registerViewConfig($container);
64: $this->registerLoaderServices($container);
65: $this->registerEngineServices($container);
66: $this->registerMustacheTemplatingServices($container);
67:
68:
69: $this->registerViewServices($container);
70: }
71:
72: 73: 74: 75:
76: protected function registerViewConfig(Container $container)
77: {
78: 79: 80: 81:
82: $container['view/config'] = function (Container $container) {
83: $config = $container['config']['view'];
84:
85: return new ViewConfig($config);
86: };
87: }
88:
89: 90: 91: 92:
93: protected function registerLoaderServices(Container $container)
94: {
95: 96: 97: 98:
99: $container['view/loader/dependencies'] = function (Container $container) {
100: return [
101: 'logger' => $container['logger'],
102: 'base_path' => $container['config']['base_path'],
103: 'paths' => $container['view/config']['paths']
104: ];
105: };
106:
107: 108: 109: 110:
111: $container['view/loader/mustache'] = function (Container $container) {
112: return new MustacheLoader($container['view/loader/dependencies']);
113: };
114:
115: 116: 117: 118:
119: $container['view/loader/php'] = function (Container $container) {
120: return new PhpLoader($container['view/loader/dependencies']);
121: };
122:
123: 124: 125: 126:
127: $container['view/loader/twig'] = function (Container $container) {
128: return new TwigLoader($container['view/loader/dependencies']);
129: };
130: }
131:
132: 133: 134: 135:
136: protected function registerEngineServices(Container $container)
137: {
138: 139: 140: 141:
142: $container['view/engine/dependencies'] = function (Container $container) {
143: return [
144: 'logger' => $container['logger'],
145: 'cache' => null,
146: 'loader' => null
147: ];
148: };
149:
150: 151: 152: 153:
154: $container['view/engine/mustache'] = function (Container $container) {
155: $engineOptions = $container['view/engine/dependencies'];
156: $engineOptions['loader'] = $container['view/loader/mustache'];
157: $engineOptions['helpers'] = $container['view/mustache/helpers'];
158: return new MustacheEngine($engineOptions);
159: };
160:
161: 162: 163: 164:
165: $container['view/engine/php'] = function (Container $container) {
166: $engineOptions = $container['view/engine/dependencies'];
167: $engineOptions['loader'] = $container['view/loader/php'];
168: return new PhpEngine($engineOptions);
169: };
170:
171: 172: 173: 174:
175: $container['view/engine/twig'] = function (Container $container) {
176: $engineOptions = $container['view/engine/dependencies'];
177: $engineOptions['loader'] = $container['view/loader/twig'];
178: return new TwigEngine($engineOptions);
179: };
180:
181: 182: 183: 184: 185: 186:
187: $container['view/engine'] = function (Container $container) {
188: $viewConfig = $container['view/config'];
189: $type = $viewConfig['default_engine'];
190: return $container['view/engine/'.$type];
191: };
192: }
193:
194: 195: 196: 197:
198: protected function registerMustacheTemplatingServices(Container $container)
199: {
200: if (!isset($container['view/mustache/helpers'])) {
201: $container['view/mustache/helpers'] = function () {
202: return [];
203: };
204: }
205:
206: 207: 208: 209: 210: 211:
212: $container->extend('view/mustache/helpers', function (array $helpers, Container $container) {
213: $deps = [];
214: if (isset($container['translator'])) {
215: $deps['translator'] = $container['translator'];
216: }
217:
218: $assets = new AssetsHelpers();
219: $i18n = new TranslatorHelpers($deps);
220:
221: return array_merge($helpers, $assets->toArray(), $i18n->toArray());
222: });
223: }
224:
225: 226: 227: 228:
229: protected function registerViewServices(Container $container)
230: {
231: 232: 233: 234: 235: 236:
237: $container['view'] = function (Container $container) {
238: return new GenericView([
239: 'logger' => $container['logger'],
240: 'engine' => $container['view/engine']
241: ]);
242: };
243:
244: 245: 246: 247: 248: 249:
250: $container['view/renderer'] = function (Container $container) {
251: return new Renderer([
252: 'view' => $container['view']
253: ]);
254: };
255: }
256: }
257: