视图层是MVC应用程序的表示层。它将应用程序逻辑与表示逻辑分开。在典型的PHP Web应用程序中,所有业务逻辑和设计都是混合在一起的。混合可以在一个小项目中加快开发速度。但是,它在涉及许多高级体系结构的大型项目中惨遭失败。要更改Web应用程序的设计,开发人员还需要处理业务逻辑。这可能是灾难性的,导致业务逻辑中断。
Zend Framework提供了一个周全,干净,灵活和可扩展的View层。View层可以作为单独的模块Zend / View使用,并且可以与Zend / Mvc模块完美集成。Zend View图层分为多个组件,彼此之间可以很好地交互。
它的各个组成部分如下-
- 变量容器-保存视图层的数据。
- 视图模型-保存可变容器和设计模板。
- 渲染器-处理来自View Model的数据和模板,并输出设计表示形式,也许是最终的html输出。
- 解析器-以渲染器可以使用的方式解析视图模型中可用的模板。
- 视图(Zend \ View \ View) -将请求映射到渲染器,然后将渲染器映射到响应。
- 渲染策略-视图用于将请求映射到渲染器。
- 响应策略-视图用于将渲染器映射到响应。
视图层View处理ViewModel,使用解析器解析模板,使用Rendering Strategy渲染模板,最后使用Response Renderer输出模板。
视图层配置
与控制器一样,可以在名为– module.config.php的模块配置文件中配置View层。主要配置是指定模板放置位置。这可以通过在“ module.config.php”中添加以下配置来完成。
'view_manager' => [ 'template_path_stack' => ['tutorial' => __DIR__ . '/../view',], ]
默认情况下,View图层的所有组件均具有默认行为。例如,ViewModel通过“小写模块名称/小写控制器名称/小写动作名称”规则在模板根目录中解析控制器操作的模板名称。但是,可以通过ViewModel的setTemplate()方法覆盖此方法。
控制器和视图层
默认情况下,控制器不需要将任何数据发送到视图层。在适当的位置编写模板就足够了。
例如,在我们的示例TutorialController中,需要将模板放置在myapp / module / Tutorial / view / tutorial / tutorial / index.phtml处。该index.phtml指的基于PHP的模板,这将是由PHPRenderer呈现。还有其他的渲染器的诸如JsonRenderer为JSON输出和FeedRenderer为RSS和原子输出。
完整的清单如下-
<?php namespace Tutorial\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class TutorialController extends AbstractActionController { public function indexAction() { } }
Zend应用程序模板
<div class = "row content"> <h3>This is my first Zend application</h3> </div>
最后,我们已经成功完成了Tutorial模块,并且可以使用url – http:// localhost:8080 / tutorial来访问它。
将数据传递到视图层
将数据发送到视图层的最简单方法是使用ViewModel参数。更改的indexAction方法如下-
public function indexAction() { $view = new ViewModel([ 'message' => 'Hello, Tutorial' ]); return $view; }
现在,如下更改index.phtml文件-
<div class = "row content"> <h3>This is my first Zend application</h3> <h4><?php echo $this->message?></h4> </div>
查看助手
View Helper用于编写要在模板中使用的小型原子功能。Zend框架提供了Zend \ View \ Helper \ HelperInterface接口来编写标准的视图助手。
HelperInterface只有两种方法,
- setView() -此方法接受Zend \ View \ Renderer \ RendererInterface实例/实现。
- getView() -用于检索该实例。
HelperInterface的完整代码清单如下-
namespace Zend\View\Helper; use Zend\View\Renderer\RendererInterface as Renderer; interface HelperInterface { /** * Set the View object * * @param Renderer $view * @return HelperInterface */ public function setView(Renderer $view); /** * Get the View object * * @return Renderer */ public function getView(); }
要在视图脚本中使用帮助器,请使用$ this-> helperName()进行访问。
内置助手
Zend Framework为各种目的提供了许多内置的辅助函数。zend-mvc中提供的一些View Helper如下-
网址
URL帮助程序用于生成与应用程序中定义的路由匹配的URL。
URL帮助器的定义是-
$this->url($name, $params, $options, $reuseMatchedParameters)
例如,在tutorial模块中,该路由被命名为tutorial,它具有两个参数action和id。我们可以使用URL助手来生成两个不同的URL,如下所示-
<a href = "<? = $this->url('tutorial'); ?>">Tutorial Index</a> <a href = "<? = $this->url('tutorial', ['action' => 'show', 'id' =>10]); ?>"> Details of Tutorial #10 </a>
结果将如下-
<a href = "/tutorial">Tutorial Index</a> <a href = "/tutorial/show/10"> Details of Tutorial #10</a>
占位符
占位符帮助器用于在视图脚本和视图实例之间保留内容。它提供了一些选项,可以先设置数据,然后在以后的阶段中使用它。
例如,我们可以设置公司名称,然后在其他所有地方使用它。
<?php $this->placeholder('companyname')->set("TutorialsPoint") ?> <?= $this->placeholder('companyname'); ?>
占位符提供了一些高级选项,可以从PHP数组和对象生成复杂的内容。它还具有捕获模板本身某些部分的选项。
例如,以下代码捕获之间的模板结果并将其存储在productlist占位符中。
类–产品
class Product { public $name; public $description; }
控制者
$p1 = new Product(); $p1->name = 'Car'; $p1->description = 'Car'; $p2 = new Product(); $p2->name = 'Cycle'; $p2->description = 'Cycle'; $view = new ViewModel(['products' => $products]);
模板
<!-- start capture --> <?php $this->placeholder('productlist')->captureStart(); foreach ($this->products as $product): ?> <div> <h2><?= $product->name ?></h2> <p><?= $product->description ?></p> </div> <?php endforeach; ?> <?php $this->placeholder('productlist')->captureEnd() ?> <!-- end capture --> <?= $this->placeholder('productlist') ?>
结果
<div class = "foo"> <h2>Car</h2> <p>Car</p> </div> <div class = "foo"> <h2>Cycle</h2> <p>Cycle</p> </div>
文件类型
Doctype帮助器用于生成各种html doctype。这是占位符助手的具体实现。可以在引导文件和配置文件中设置doctype。
基本用法如下所示-
应用程序引导文件
use Zend\View\Helper\Doctype; $doctypeHelper = new Doctype(); $doctypeHelper->doctype('XHTML5');
模块配置
// module/Application/config/module.config.php: return [ /* ... */ 'view_manager' => [ 'doctype' => 'html5', /* ... */ ], ];
模板
<?php echo $this->doctype() ?>
标题
HeadTitle帮助器用于生成html title元素。它是占位符助手的具体实现。Zend提供了一个在模块配置文件中设置标题的选项,可以在站点,模块,控制器,操作等任何级别进行设置。HeadTitle的部分代码如下-
模组
headTitleHelper->append($action); $headTitleHelper->append($controller); $headTitleHelper->append($module); $headTitleHelper->append($siteName);
模板
<?= $this->headTitle() ?>
结果
action - controller - module - Zend Framework
元数据
HeadMeta帮助器用于生成html元标记。它是占位符助手的具体实现。
模板–
<?php $this->headMeta()->appendName('keywords', 'turorialspoint, zend framework, php'); echo $this->headMeta() ?>
结果
<meta name = "keywords" content = "tutorialspoint, zend framework, php" />
头链接
HeadLink帮助器用于生成html链接以包括外部资源。这是占位符助手的具体实现。
模板
<?php // setting links in a view script: $this->headLink(['rel' => 'icon', 'href' => '/img/favicon.ico'], 'PREPEND') ->appendStylesheet('/styles/site.css') ->prependStylesheet('/styles/mystyle.css', 'screen', true, ['id' => 'mystyle']); // rendering the links from the layout: echo $this->headLink(); ?>
结果
<link href = "/styles/mystyle.css" media = "screen" rel = "stylesheet" type = "text/css" id = "mystyle"> <link href = "/img/favicon.ico" rel = "icon"> <link href = "/styles/site.css" media = "screen" rel = "stylesheet" type = "text/css">
HeadStyle
HeadStyle帮助器用于生成内联CSS样式。这是占位符助手的具体实现。
模板
<?php $this->headStyle()->appendStyle($styles); ?> <?php echo $this->headStyle() ?>
标题脚本
HeadScript用于生成内联脚本或包括外部脚本。这是占位符助手的具体实现。
模板
<? $this->headScript()->appendFile(‘/js/sample.js’);?> <?php echo $this->headScript() ?>
内联脚本
InlineScript用于在html模板的head和body部分中生成脚本。它是从HeadScript派生的。
HTML列表
HTMLList用于生成有序列表和无序列表。HTMLList的定义如下-
定义
htmlList($items, $ordered, $attribs, $escape)
模板
$items = [ '2015', ['March', 'November'], '2016', ]; echo $this->htmlList($items);
结果
<ul> <li>2015 <ul> <li>March</li> <li>November</li> </ul> </li> <li>2016</li> </ul>
周期
循环用于在循环环境中生成替代方案。它具有分配,下一个和上一个功能。
控制者
$view = new ViewModel(['message' => 'Hello, Tutorial', 'data' => array('One', 'Two')]);
模板
<?php $this->cycle()->assign(['#F0F0F0', '#FFF'], 'colors'); ?> <table> <?php foreach ($this->data as $datum): ?> <tr style = "background-color: <?= $this->cycle()->setName('colors')>next() ?>"> <td><?= $this->escapeHtml($datum) ?></td> </tr> <?php endforeach ?> </table>
结果
<table> <tr style = "background-color: #F0F0F0"> <td>One</td> </tr> <tr style = "background-color: #FFF"> <td>Two</td> </tr> </table>
其他一些重要的内置帮助器如下-
- BasePath -BasePath用于生成应用程序根目录的公用文件夹的路径。
- 部分-部分用于在其自己的变量范围内呈现特定模板。
- PartialLoop -PartialLoop类似于Partial,但是在循环环境中使用。
- 身份-身份用于从身份验证服务中检索登录用户的身份。
- JSON -JSON用于宁静的环境中,其中输出为JSON格式。它发出适当的HTTP标头并禁用布局概念。
Zend Framework中仍然有很多可用的助手,例如i18n助手,表单助手,分页助手,导航助手等。
创建视图助手
Zend框架提供了一个内置的AbstractHelper,实现了HelperInterface来编写视图助手。
编写新助手的步骤如下-
- 步骤1-扩展类Zend \ View \ Helper \ AbstractHelper。
- 步骤2-覆盖__invoke()函数。
- 步骤3-在module.config.php文件中设置配置。
- 步骤4-在视图脚本中使用视图助手。
现在让我们创建一个TestHelper
在myapp / module / Tutorial / src / View目录中创建Helper文件夹。写TestHelper助手目录中,TestHelper.php。
完整的清单如下-
<?php namespace Tutorial\View\Helper; use Zend\View\Helper\AbstractHelper; class TestHelper extends AbstractHelper { public function __invoke() { $output = "I am from test helper"; return htmlspecialchars($output, ENT_QUOTES, 'UTF-8'); } }
在module.config.php中设置配置。
'view_helpers' => [ 'aliases' => [ 'testHelper' => View\Helper\TestHelper::class, ], 'factories' => [ View\Helper\TestHelper::class => InvokableFactory::class, ], ],
使用新创建的TestHelper在大约视图脚本。
<?= $this->testHelper() ?>
作者:terry,如若转载,请注明出处:https://www.web176.com/zendframework/293.html