- Zend Framework 教程
- Zend Framework - 首页
- Zend Framework - 简介
- Zend Framework - 安装
- 骨架应用
- Zend Framework - MVC 架构
- Zend Framework - 概念
- Zend Framework - 服务管理器
- Zend Framework - 事件管理器
- Zend Framework - 模块系统
- 应用结构
- Zend Framework - 创建模块
- Zend Framework - 控制器
- Zend Framework - 路由
- Zend Framework - 视图层
- Zend Framework - 布局
- 模型 & 数据库
- 不同的数据库
- 表单 & 验证
- Zend Framework - 文件上传
- Zend Framework - Ajax
- Cookie 管理
- 会话管理
- Zend Framework - 认证
- 邮件管理
- Zend Framework - 单元测试
- Zend Framework - 错误处理
- Zend Framework - 工作示例
- Zend Framework 有用资源
- Zend Framework - 快速指南
- Zend Framework - 有用资源
- Zend Framework - 讨论
Zend Framework - 视图层
视图层是 MVC 应用的表示层。它将应用逻辑与表示逻辑分离。在一个典型的 PHP Web 应用中,所有业务逻辑和设计都混合在一起。混合使得小型项目的开发速度更快。但是,在大项目中,涉及到很多高级架构时,它就会彻底失败。要更改 Web 应用的设计,开发人员也需要处理业务逻辑。这可能造成灾难性的后果,导致业务逻辑中断。
Zend Framework 提供了一个经过深思熟虑、简洁、灵活且可扩展的视图层。视图层作为一个单独的模块提供,即 **Zend/View**,并与 **Zend/Mvc** 模块很好地集成。Zend 视图层被分成多个组件,彼此之间很好地交互。
其各个组件如下所示:
**变量容器** - 存储视图层的数据。
**视图模型** - 存储变量容器和设计模板。
**渲染器** - 处理来自视图模型的数据和模板,并输出设计表示,可能是最终的 HTML 输出。
**解析器** - 以渲染器可以消费的方式解析视图模型中可用的模板。
**视图 (Zend\View\View)** - 将请求映射到渲染器,然后将渲染器映射到响应。
**渲染策略** - 视图用来将请求映射到渲染器的策略。
**响应策略** - 视图用来将渲染器映射到响应的策略。
视图层,**View** 处理 **ViewModel**,使用 **Resolver** 解析模板,使用 **Rendering Strategy** 渲染它,最后使用 **Response Renderer** 输出它。
视图层配置
像控制器一样,视图层可以在模块的配置文件中配置,称为 - **module.config.php**。主要配置是指定模板将放置的位置。这可以通过在“module.config.php”中添加以下配置来实现。
'view_manager' => [ 'template_path_stack' => ['tutorial' => __DIR__ . '/../view',], ]
默认情况下,视图层对其所有组件都有默认行为。例如,**ViewModel** 根据“lowercase-module-name/lowercase-controller-name/lowercase-action-name”规则,在模板根目录内解析控制器的操作的模板名称。但是,这可以通过 **ViewModel** 的 **setTemplate()** 方法覆盖。
控制器和视图层
默认情况下,控制器不需要向视图层发送任何数据。将模板放在正确的位置就足够了。
例如,在我们的示例 **TutorialController** 中,模板需要放在 **myapp/module/Tutorial/view/tutorial/tutorial/index.phtml**。**index.phtml** 指的是基于 PHP 的模板,它将由 PHPRenderer 渲染。还有其他渲染器,例如 **JsonRenderer** 用于 **json** 输出和 **FeedRenderer** 用于 **rss** 和 **atom** 输出。
完整的列表如下所示:
<?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 访问它 - **https://: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>
视图助手
视图助手用于编写小的、原子化的函数,以便在模板中使用。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** 中的一些可用视图助手如下所示:
URL
URL 助手用于生成与应用中定义的路由匹配的 URL。
URL 助手的定义如下所示:
$this->url($name, $params, $options, $reuseMatchedParameters)
例如,在教程模块中,路由名为 **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 文档类型。它是 **Placeholder** 助手的具体实现。文档类型可以在引导文件和配置文件中设置。
基本用法如下所示:
应用引导文件
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 标题元素。它是 **Placeholder** 助手的具体实现。Zend 提供了一个选项,可以在模块配置文件中设置标题,并且可以在任何级别设置,例如站点、模块、控制器、操作等。HeadTitle 的部分代码如下所示:
模块
headTitleHelper->append($action); $headTitleHelper->append($controller); $headTitleHelper->append($module); $headTitleHelper->append($siteName);
模板
<?= $this->headTitle() ?>
结果
action - controller - module - Zend Framework
元数据
HeadMeta 助手用于生成 html 元标记。它是 **Placeholder** 助手的具体实现。
**模板** -
<?php
$this->headMeta()->appendName('keywords', 'turorialspoint, zend framework, php');
echo $this->headMeta()
?>
结果
<meta name = "keywords" content = "tutorialspoint, zend framework, php" />
链接
HeadLink 助手用于生成包含外部资源的 html 链接。它是 **Placeholder** 助手的具体实现。
模板
<?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 助手用于生成内联 CSS 样式。它是 **Placeholder** 助手的具体实现。
模板
<?php $this->headStyle()->appendStyle($styles); ?> <?php echo $this->headStyle() ?>
脚本
HeadScript 用于生成内联脚本或包含外部脚本。它是 **Placeholder** 助手的具体实现。
模板
<? $this->headScript()->appendFile(‘/js/sample.js’);?> <?php echo $this->headScript() ?>
内联脚本
InlineScript 用于在 html 模板的头部和主体部分生成脚本。它派生自 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>
循环
Cycle 用于在循环环境中生成备选方案。它具有 assign、next 和 prev 函数。
控制器
$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 用于生成应用根目录的 public 文件夹的路径。
**Partial** - Partial 用于在其自己的变量范围内渲染特定的模板。
**PartialLoop** - PartialLoop 与 Partial 类似,但用于循环环境中。
**Identity** - Identity 用于从身份验证服务中检索已登录用户的身份。
**JSON** - JSON 用于 RESTful 环境中,其中输出为 JSON 格式。它发出正确的 HTTP 标头并禁用布局概念。
Zend Framework 中还有许多其他助手,例如 **i18n 助手、表单助手、分页助手、导航助手** 等。
创建视图助手
Zend Framework 提供了一个内置的 **AbstractHelper**,它实现了 **HelperInterface** 来编写视图助手。
编写新助手的步骤如下所示:
**步骤 1** - 扩展类 **Zend\View\Helper\AbstractHelper**。
**步骤 2** - 覆盖 **__invoke()** 函数。
**步骤 3** - 在 **module.config.php 文件** 中设置配置。
**步骤 4** - 在视图脚本中使用视图助手。
现在让我们创建一个 **TestHelper**
在 **myapp/module/Tutorial/src/View 目录** 中创建 Helper 文件夹。在 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,
],
],
在 **about** 视图脚本中使用新创建的 **TestHelper**。
<?= $this->testHelper() ?>