📜  Zend框架-视图层

📅  最后修改于: 2020-10-16 07:40:37             🧑  作者: Mango


视图层是MVC应用程序的表示层。它将应用程序逻辑与表示逻辑分开。在典型的PHP Web应用程序中,所有业务逻辑和设计都是混合在一起的。混合可以在一个小项目中加快开发速度。但是,它在涉及许多高级体系结构的大型项目中惨遭失败。要更改Web应用程序的设计,开发人员还需要处理业务逻辑。这可能是灾难性的,导致业务逻辑中断。

Zend Framework提供了一个周全,干净,灵活和可扩展的View层。 View层可以作为单独的模块Zend / View使用,并且可以与Zend / Mvc模块完美集成。 Zend View图层分为多个组件,彼此之间可以很好地交互。

它的各个组成部分如下-

  • 变量容器-保存视图层的数据。

  • 视图模型-保存可变容器和设计模板。

  • 渲染器-处理来自View模型的数据和模板,并输出设计表示形式,也许是最终的html输出。

  • 解析器-以渲染器可以使用的方式解析视图模型中可用的模板。

  • 视图(Zend \ View \ View) -将请求映射到渲染器,然后将渲染器映射到响应。

  • 渲染策略-视图用于将请求映射到渲染器。

  • 响应策略-视图用于将渲染器映射到响应。

视图层View处理ViewModel ,使用解析器解析模板,使用渲染策略渲染模板,最后使用响应渲染器输出模板。

视图层配置

与控制器一样,可以在名为– 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呈现。还有其他的渲染器的诸如JsonRendererJSON输出和FeedRendererRSSAtom输出。

完整的清单如下-

Zend应用程序模板

This is my first Zend application

最后,我们已经成功完成了Tutorial模块,并且可以使用url – http:// localhost:8080 / tutorial来访问它。

应用模板

将数据传递到视图层

将数据发送到视图层的最简单方法是使用ViewModel参数。更改的indexAction方法如下-

public function indexAction() { 
   $view = new ViewModel([ 
      'message' => 'Hello, Tutorial' 
   ]);  
   return $view; 
} 

现在,如下更改index.phtml文件-

This is my first Zend application

message?>

查看助手

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 ,它具有两个参数actionid 。我们可以使用URL助手来生成两个不同的URL,如下所示-

结果将如下-

占位符

占位符帮助器用于在视图脚本和视图实例之间保留内容。它提供了一些选项,可以先设置数据,然后在以后的阶段中使用它。

例如,我们可以设置公司名称,然后在其他所有地方使用它。

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]); 

模板

 
placeholder('productlist')->captureStart(); 
   foreach ($this->products as $product): ?> 

= $product->name ?>

= $product->description ?>

placeholder('productlist')->captureEnd() ?> = $this->placeholder('productlist') ?>

结果

Car

Car

Cycle

Cycle

文件类型

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', 
      /* ... */ 
   ], 
]; 

模板

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元标记。它是占位符助手的具体实现。

模板

headMeta()->appendName('keywords', 'turorialspoint, zend framework, php');  
   echo $this->headMeta() 
?>

结果


头链接

HeadLink帮助器用于生成html链接以包括外部资源。这是占位符助手的具体实现。

模板

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(); 
?>

结果

 
 

HeadStyle

HeadStyle帮助器用于生成内联CSS样式。这是占位符助手的具体实现。

模板

headStyle()->appendStyle($styles); ?>  
headStyle() ?>

标题脚本

HeadScript用于生成内联脚本或包括外部脚本。这是占位符助手的具体实现。

模板

$this->headScript()->appendFile(‘/js/sample.js’);?>  
headScript() ?>

内联脚本

InlineScript用于在html模板的head和body部分中生成脚本。它是从HeadScript派生的。

HTML列表

HTMLList用于生成有序列表和无序列表。 HTMLList的定义如下-

定义

htmlList($items, $ordered, $attribs, $escape) 

模板

$items = [ 
   '2015', 
   ['March', 'November'], 
   '2016', 
];  
echo $this->htmlList($items);

结果

  • 2015
    • March
    • November
  • 2016

周期

循环用于在循环环境中生成替代方案。它具有分配,下一个和上一个函数。

控制者

$view = new ViewModel(['message' => 'Hello, Tutorial', 'data' => array('One', 'Two')]);

模板

cycle()->assign(['#F0F0F0', '#FFF'], 'colors'); ?>

data as $datum): ?>
   
= $this->escapeHtml($datum) ?>

结果

One
Two

其他一些重要的内置帮助器如下-

  • 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。

完整的清单如下-

module.config.php中设置配置。

'view_helpers' => [ 
   'aliases' => [ 
      'testHelper' => View\Helper\TestHelper::class, 
   ], 
   'factories' => [ 
      View\Helper\TestHelper::class => InvokableFactory::class, 
   ],
], 

使用新创建的TestHelper大约视图脚本。

= $this->testHelper() ?>