WARNING: Please note that this article was published a long time ago. The information contained might be outdated.
This is part one of a multi-series on using the zend-view as a stand-alone library. The code is available on https://github.com/lorenzoferrarajr/zend-view-examples.
Other parts:
- Part one: How to render html using Zend View
- Part two: LFI Protection and PHAR support from TemplatePathStack
zendframework/zend-view is the view layer of zend-mvc. To use it at its basic, two concepts are important: resolvers and renderes:
- resolvers are responsible of finding the resources (view files) needed by the renderer
- renderers are responsible of rendering views resources
Assumptions
I'm assuming that a view directory exists, containing some phtml files:
view/
|- view-1.phtml
|- view-2.phtml
|- sub-1/
| \- view-3.phtml
|
\- sub-2/
|- view-3.phtml
\- view-4.phtml
The view/view-1.phtml file contains only text:
Hello, World!
The view/view-2.phtml file contains text and some PHP code:
Hello, <?=$who?>!
The view/sub1/view-3.phtml file also contains text and some PHP code:
This is view/sub1/view-3.phtml
Resolvers: TemplateMapResolver and TemplatePathStack
An instance of the TemplateMapResolver class can be configured to associate one or more keys to a view file.
$resolver = new \Zend\View\Resolver\TemplateMapResolver([
'first-view' => 'view/view-1.phtml'
]);
var_dump($resolver->resolve('first-view')); // 'view/view-1.phtml'
In the example, the resolver is able to find the view/view-1.phtml file only when the string first-view is used as parameter of the resolve method.
Another resolver is TemplatePathStack: given one or more paths, the resolver can find a specified file searching it inside the paths.
$resolver = new \Zend\View\Resolver\TemplatePathStack([
'script_paths' => [
'view/sub1/'
]
]);
var_dump($resolver->resolve('view-3.phtml')); // '/.../view/sub1/view-3.phtml'
var_dump($resolver->resolve('view-3')); // '/.../view/sub1/view-3.phtml'
If two paths contain a view-3.phtml file, the one added last wins. Both view-3.phtml and view-3 are valid because the TemplatePathStack resolver adds the file suffix when not specified.
Resolvers: AggregateResolver
Another way to manage resolvers is by creating an AggregateResolver. As the name suggests, an AggregateResolver uses other resolvers to find files.
$resolver1 = new \Zend\View\Resolver\TemplatePathStack([
'script_paths' => [
'view/sub1/',
]
]);
$resolver2 = new \Zend\View\Resolver\TemplateMapResolver([
'first-view' => 'view/view-1.phtml'
]);
$aggregateResolver = new \Zend\View\Resolver\AggregateResolver();
$aggregateResolver->attach($resolver1);
$aggregateResolver->attach($resolver2);
var_dump($aggregateResolver->resolve('first-view')); // 'view/view-1.phtml'
var_dump($aggregateResolver->resolve('view-1')); // bool(false)
var_dump($aggregateResolver->resolve('view-1.phtml')); // bool(false)
var_dump($aggregateResolver->resolve('view-2')); // bool(false)
var_dump($aggregateResolver->resolve('view-3')); // '/.../view/sub1/view-3.phtml'
Searching for view-1, view-1.phtml, or view-2 fails because the first resolver is configured to search in the view/sub1/ directory, which does not contain the view-1.phtml or view-2.html files, and the second resolver is a TemplateMapResolver, and the only view it has configured is first-view.
Renderer: PhpRenderer
A PhpRenderer object is responsible of generating markup. The object needs a resolver (or an aggregate resolver) to locate the resources. A very basic example:
$resolver = new \Zend\View\Resolver\TemplateMapResolver([
'first-view' => 'view/view-1.phtml'
]);
$renderer = new \Zend\View\Renderer\PhpRenderer();
$renderer->setResolver($resolver);
var_dump($renderer->render('first-view')); // string(13) "Hello, World!"
The render method accepts a second argument, an array containing the data that will be passed to the resource to be rendered:
$resolver = new \Zend\View\Resolver\TemplatePathStack([
'script_paths' => [
'view/',
]
]);
$renderer = new \Zend\View\Renderer\PhpRenderer();
$renderer->setResolver($resolver);
$content = $renderer->render('view-2', ['who' => 'Earth']);
var_dump($content); // string(13) "Hello, Earth!"
What's next
This concludes the first part of this series. Next, I'll talk more about the TemplatePathStack and about how renderers can be enriched by the \Zend\View\HelperPluginManager.