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

Commit fd65be0

Browse files
committed
Split ZendViewRendererFactory into multiple services
1 parent 9a81c85 commit fd65be0

8 files changed

+328
-251
lines changed

src/HelperPluginManagerFactory.php

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
33
* @see https://github.com/zendframework/zend-expressive-zendviewrenderer for the canonical source repository
4-
* @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (https://www.zend.com)
4+
* @copyright Copyright (c) 2015-2019 Zend Technologies USA Inc. (https://www.zend.com)
55
* @license https://github.com/zendframework/zend-expressive-zendviewrenderer/blob/master/LICENSE.md New BSD License
66
*/
77

@@ -10,10 +10,12 @@
1010
namespace Zend\Expressive\ZendView;
1111

1212
use Psr\Container\ContainerInterface;
13+
use Zend\Expressive\Helper\ServerUrlHelper as BaseServerUrlHelper;
14+
use Zend\Expressive\Helper\UrlHelper as BaseUrlHelper;
1315
use Zend\ServiceManager\Config;
1416
use Zend\View\HelperPluginManager;
1517

16-
class HelperPluginManagerFactory
18+
final class HelperPluginManagerFactory
1719
{
1820
public function __invoke(ContainerInterface $container) : HelperPluginManager
1921
{
@@ -26,6 +28,45 @@ public function __invoke(ContainerInterface $container) : HelperPluginManager
2628
(new Config($config))->configureServiceManager($manager);
2729
}
2830

31+
$this->injectHelpers($manager, $container);
2932
return $manager;
3033
}
34+
35+
/**
36+
* Inject helpers into the HelperPhpRenderer instance.
37+
*
38+
* If a HelperPluginManager instance is present in the container, uses that;
39+
* otherwise, instantiates one.
40+
*
41+
* In each case, injects with the custom url/serverurl implementations.
42+
*
43+
* @throws Exception\MissingHelperException
44+
*/
45+
private function injectHelpers(HelperPluginManager $helpers, ContainerInterface $container) : void
46+
{
47+
$helpers->setAlias('url', BaseUrlHelper::class);
48+
$helpers->setAlias('Url', BaseUrlHelper::class);
49+
$helpers->setFactory(BaseUrlHelper::class, static function () use ($container) {
50+
if (! $container->has(BaseUrlHelper::class)) {
51+
throw new Exception\MissingHelperException(sprintf(
52+
'An instance of %s is required in order to create the "url" view helper; not found',
53+
BaseUrlHelper::class
54+
));
55+
}
56+
return new UrlHelper($container->get(BaseUrlHelper::class));
57+
});
58+
59+
$helpers->setAlias('serverurl', BaseServerUrlHelper::class);
60+
$helpers->setAlias('serverUrl', BaseServerUrlHelper::class);
61+
$helpers->setAlias('ServerUrl', BaseServerUrlHelper::class);
62+
$helpers->setFactory(BaseServerUrlHelper::class, static function () use ($container) {
63+
if (! $container->has(BaseServerUrlHelper::class)) {
64+
throw new Exception\MissingHelperException(sprintf(
65+
'An instance of %s is required in order to create the "url" view helper; not found',
66+
BaseServerUrlHelper::class
67+
));
68+
}
69+
return new ServerUrlHelper($container->get(BaseServerUrlHelper::class));
70+
});
71+
}
3172
}

src/NamespacedPathStackResolverFactory.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@
1111

1212
use Psr\Container\ContainerInterface;
1313

14-
class NamespacedPathStackResolverFactory
14+
final class NamespacedPathStackResolverFactory
1515
{
1616
public function __invoke(ContainerInterface $container) : NamespacedPathStackResolver
1717
{
1818
$config = $container->has('config') ? $container->get('config') : [];
1919
$config = $config['templates'] ?? [];
2020

2121
$resolver = new NamespacedPathStackResolver();
22-
if (! empty($config['default_suffix'])) {
23-
$resolver->setDefaultSuffix($config['default_suffix']);
22+
if (! empty($config['extension'])) {
23+
$resolver->setDefaultSuffix($config['extension']);
2424
}
2525

2626
return $resolver;

src/PhpRendererFactory.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
/**
3+
* @see https://github.com/zendframework/zend-expressive-zendviewrenderer for the canonical source repository
4+
* @copyright Copyright (c) 2019 Zend Technologies USA Inc. (https://www.zend.com)
5+
* @license https://github.com/zendframework/zend-expressive-zendviewrenderer/blob/master/LICENSE.md New BSD License
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace Zend\Expressive\ZendView;
11+
12+
use Psr\Container\ContainerInterface;
13+
use Zend\View\HelperPluginManager;
14+
use Zend\View\Renderer\PhpRenderer;
15+
use Zend\View\Resolver\AggregateResolver;
16+
use Zend\View\Resolver\TemplateMapResolver;
17+
18+
final class PhpRendererFactory
19+
{
20+
public function __invoke(ContainerInterface $container) : PhpRenderer
21+
{
22+
$config = $container->has('config') ? $container->get('config') : [];
23+
24+
$resolver = new AggregateResolver();
25+
$resolver->attach(
26+
new TemplateMapResolver($config['templates']['map'] ?? []),
27+
100
28+
);
29+
30+
$nsPathResolver = $container->get(NamespacedPathStackResolver::class);
31+
$resolver->attach(
32+
$nsPathResolver,
33+
0
34+
);
35+
36+
$renderer = new PhpRenderer();
37+
$renderer->setResolver($resolver);
38+
39+
$helpers = $container->get(HelperPluginManager::class);
40+
$renderer->setHelperPluginManager($helpers);
41+
42+
return $renderer;
43+
}
44+
}

src/ZendViewRendererFactory.php

Lines changed: 3 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,14 @@
1010
namespace Zend\Expressive\ZendView;
1111

1212
use Psr\Container\ContainerInterface;
13-
use Zend\Expressive\Helper\ServerUrlHelper as BaseServerUrlHelper;
14-
use Zend\Expressive\Helper\UrlHelper as BaseUrlHelper;
15-
use Zend\View\HelperPluginManager;
1613
use Zend\View\Renderer\PhpRenderer;
17-
use Zend\View\Resolver;
1814

1915
use function is_array;
2016
use function is_numeric;
21-
use function sprintf;
2217

2318
/**
2419
* Create and return a ZendView template instance.
2520
*
26-
* Requires the Zend\Expressive\Router\RouterInterface service (for creating
27-
* the UrlHelper instance).
28-
*
29-
* Optionally requires the Zend\View\HelperPluginManager service; if present,
30-
* will use the service to inject the PhpRenderer instance.
31-
*
3221
* Optionally uses the service 'config', which should return an array. This
3322
* factory consumes the following structure:
3423
*
@@ -47,43 +36,16 @@
4736
* ],
4837
* ]
4938
* </code>
50-
*
51-
* Injects the HelperPluginManager used by the PhpRenderer with zend-expressive
52-
* overrides of the url and serverurl helpers.
5339
*/
54-
class ZendViewRendererFactory
40+
final class ZendViewRendererFactory
5541
{
5642
public function __invoke(ContainerInterface $container) : ZendViewRenderer
5743
{
5844
$config = $container->has('config') ? $container->get('config') : [];
5945
$config = $config['templates'] ?? [];
6046

61-
62-
// Configuration
63-
$resolver = new Resolver\AggregateResolver();
64-
$resolver->attach(
65-
new Resolver\TemplateMapResolver($config['map'] ?? []),
66-
100
67-
);
68-
69-
$nsPathResolver = new NamespacedPathStackResolver();
70-
// Set default suffix
71-
if (isset($config['extension'])) {
72-
$nsPathResolver->setDefaultSuffix($config['extension']);
73-
}
74-
$resolver->attach(
75-
$nsPathResolver,
76-
0
77-
);
78-
79-
// Create or retrieve the renderer from the container
80-
$renderer = $container->has(PhpRenderer::class)
81-
? $container->get(PhpRenderer::class)
82-
: new PhpRenderer();
83-
$renderer->setResolver($resolver);
84-
85-
// Inject helpers
86-
$this->injectHelpers($renderer, $container);
47+
$renderer = $container->get(PhpRenderer::class);
48+
$nsPathResolver = $container->get(NamespacedPathStackResolver::class);
8749

8850
// Inject renderer
8951
$view = new ZendViewRenderer($renderer, $nsPathResolver, $config['layout'] ?? null);
@@ -99,56 +61,4 @@ public function __invoke(ContainerInterface $container) : ZendViewRenderer
9961

10062
return $view;
10163
}
102-
103-
/**
104-
* Inject helpers into the PhpRenderer instance.
105-
*
106-
* If a HelperPluginManager instance is present in the container, uses that;
107-
* otherwise, instantiates one.
108-
*
109-
* In each case, injects with the custom url/serverurl implementations.
110-
*
111-
* @throws Exception\InvalidContainerException if the $container argument
112-
* does not implement InteropContainerInterface.
113-
* @throws Exception\MissingHelperException
114-
*/
115-
private function injectHelpers(PhpRenderer $renderer, ContainerInterface $container) : void
116-
{
117-
$helpers = $this->retrieveHelperManager($container);
118-
$helpers->setAlias('url', BaseUrlHelper::class);
119-
$helpers->setAlias('Url', BaseUrlHelper::class);
120-
$helpers->setFactory(BaseUrlHelper::class, function () use ($container) {
121-
if (! $container->has(BaseUrlHelper::class)) {
122-
throw new Exception\MissingHelperException(sprintf(
123-
'An instance of %s is required in order to create the "url" view helper; not found',
124-
BaseUrlHelper::class
125-
));
126-
}
127-
return new UrlHelper($container->get(BaseUrlHelper::class));
128-
});
129-
130-
$helpers->setAlias('serverurl', BaseServerUrlHelper::class);
131-
$helpers->setAlias('serverUrl', BaseServerUrlHelper::class);
132-
$helpers->setAlias('ServerUrl', BaseServerUrlHelper::class);
133-
$helpers->setFactory(BaseServerUrlHelper::class, function () use ($container) {
134-
if (! $container->has(BaseServerUrlHelper::class)) {
135-
throw new Exception\MissingHelperException(sprintf(
136-
'An instance of %s is required in order to create the "url" view helper; not found',
137-
BaseServerUrlHelper::class
138-
));
139-
}
140-
return new ServerUrlHelper($container->get(BaseServerUrlHelper::class));
141-
});
142-
143-
$renderer->setHelperPluginManager($helpers);
144-
}
145-
146-
private function retrieveHelperManager(ContainerInterface $container) : HelperPluginManager
147-
{
148-
if ($container->has(HelperPluginManager::class)) {
149-
return $container->get(HelperPluginManager::class);
150-
}
151-
152-
return new HelperPluginManager($container);
153-
}
15464
}

test/HelperPluginManagerFactoryTest.php

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
33
* @see https://github.com/zendframework/zend-expressive-zendviewrenderer for the canonical source repository
4-
* @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (https://www.zend.com)
4+
* @copyright Copyright (c) 2015-2019 Zend Technologies USA Inc. (https://www.zend.com)
55
* @license https://github.com/zendframework/zend-expressive-zendviewrenderer/blob/master/LICENSE.md New BSD License
66
*/
77

@@ -11,21 +11,24 @@
1111

1212
use PHPUnit\Framework\TestCase;
1313
use Prophecy\Prophecy\ProphecyInterface;
14+
use Psr\Container\ContainerInterface;
15+
use Zend\Expressive\Helper as ExpressiveHelper;
1416
use Zend\Expressive\ZendView\HelperPluginManagerFactory;
15-
use Zend\ServiceManager\ServiceManager;
17+
use Zend\Expressive\ZendView\ServerUrlHelper;
18+
use Zend\Expressive\ZendView\UrlHelper;
1619
use Zend\View\HelperPluginManager;
1720
use ZendTest\Expressive\ZendView\TestAsset\TestHelper;
1821

1922
class HelperPluginManagerFactoryTest extends TestCase
2023
{
2124
/**
22-
* @var ServiceManager|ProphecyInterface
25+
* @var ContainerInterface|ProphecyInterface
2326
*/
2427
private $container;
2528

2629
public function setUp()
2730
{
28-
$this->container = $this->prophesize(ServiceManager::class);
31+
$this->container = $this->prophesize(ContainerInterface::class);
2932
}
3033

3134
public function testCallingFactoryWithNoConfigReturnsHelperPluginManagerInstance()
@@ -66,4 +69,25 @@ public function testCallingFactoryWithConfigAllowsAddingHelpers()
6669
$this->assertInstanceOf(TestHelper::class, $manager->get('testHelper'));
6770
return $manager;
6871
}
72+
73+
public function testInjectsCustomHelpersIntoHelperManager()
74+
{
75+
$this->container->has(ExpressiveHelper\UrlHelper::class)->willReturn(true);
76+
$this->container->get(ExpressiveHelper\UrlHelper::class)->willReturn(
77+
$this->prophesize(ExpressiveHelper\UrlHelper::class)->reveal()
78+
);
79+
$this->container->has(ExpressiveHelper\ServerUrlHelper::class)->willReturn(true);
80+
$this->container->get(ExpressiveHelper\ServerUrlHelper::class)->willReturn(
81+
$this->prophesize(ExpressiveHelper\ServerUrlHelper::class)->reveal()
82+
);
83+
84+
$this->container->has('config')->willReturn(false);
85+
$factory = new HelperPluginManagerFactory();
86+
$helpers = $factory($this->container->reveal());
87+
88+
$this->assertTrue($helpers->has('url'));
89+
$this->assertTrue($helpers->has('serverurl'));
90+
$this->assertInstanceOf(UrlHelper::class, $helpers->get('url'));
91+
$this->assertInstanceOf(ServerUrlHelper::class, $helpers->get('serverurl'));
92+
}
6993
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
/**
3+
* @see https://github.com/zendframework/zend-expressive-zendviewrenderer for the canonical source repository
4+
* @copyright Copyright (c) 2019 Zend Technologies USA Inc. (https://www.zend.com)
5+
* @license https://github.com/zendframework/zend-expressive-zendviewrenderer/blob/master/LICENSE.md New BSD License
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace ZendTest\Expressive\ZendView;
11+
12+
use Prophecy\Prophecy\ProphecyInterface;
13+
use Psr\Container\ContainerInterface;
14+
use Zend\Expressive\ZendView\NamespacedPathStackResolver;
15+
use Zend\Expressive\ZendView\NamespacedPathStackResolverFactory;
16+
use PHPUnit\Framework\TestCase;
17+
18+
/**
19+
* @covers \Zend\Expressive\ZendView\NamespacedPathStackResolverFactory
20+
*/
21+
class NamespacedPathStackResolverFactoryTest extends TestCase
22+
{
23+
/**
24+
* @var ContainerInterface|ProphecyInterface
25+
*/
26+
private $container;
27+
28+
public function setUp()
29+
{
30+
$this->container = $this->prophesize(ContainerInterface::class);
31+
}
32+
33+
public function canCreateResolver()
34+
{
35+
$factory = new NamespacedPathStackResolverFactory();
36+
$resolver = $factory($this->container->reveal());
37+
$this->assertInstanceOf(NamespacedPathStackResolver::class, $resolver);
38+
}
39+
40+
public function testConfiguresCustomDefaultSuffix()
41+
{
42+
$config = [
43+
'templates' => [
44+
'extension' => 'php',
45+
],
46+
];
47+
48+
$this->container->has('config')->willReturn(true);
49+
$this->container->get('config')->willReturn($config);
50+
51+
$factory = new NamespacedPathStackResolverFactory();
52+
$resolver = $factory($this->container->reveal());
53+
$this->assertEquals('php', $resolver->getDefaultSuffix());
54+
}
55+
}

0 commit comments

Comments
 (0)