Yaf 框架实战|一文搞定手动指定 View 视图页面

5次阅读
没有评论

PHP 轻量级高性能框架中,Yaf(鸟哥出品)凭借无侵入、高并发的特性成为众多项目的首选。Yaf 遵循约定大于配置设计理念,视图渲染默认会自动匹配固定路径的模板文件。

但在实际开发中,我们经常需要手动指定 View 页面:比如复用公共模板、跨模块渲染页面、自定义模板路径、统一错误页等。

这篇博文就带大家从零开始,全面掌握 Yaf 手动指定视图的所有方法、实战场景和避坑指南!


一、前置知识:Yaf 视图默认渲染规则

在学习手动指定前,我们先搞懂 Yaf 自动渲染视图的默认规则,这是理解后续操作的基础:

默认路径规则

plaintext

application/modules/[模块名]/views/scripts/[控制器名]/[动作名].phtml
  • 默认模板后缀:.phtml(可配置修改)
  • 目录 / 文件名全小写Linux 系统严格区分大小写,Windows 无影响)

示例

模块:Index、控制器:User、动作:profile

默认渲染的模板:

plaintext

application/modules/Index/views/scripts/user/profile.phtml

控制器中如果不写任何视图相关代码,Yaf 会自动渲染上述模板。而手动指定 View,就是打破这个默认规则,让我们自由选择模板文件。


二、核心方法:Yaf 指定 View 页面的 4 种方式

我按照使用场景从简单到进阶分类,所有代码均可直接复制使用。

方法 1:控制器内 $this->display() 【最常用、零学习成本】

Yaf_Controller_Abstract 基类直接提供了 display() 方法,是开发中最常用的指定方式,专为标准路径模板设计。

方法原型

php

运行

/**
 * @param string $action    模板文件名(无后缀)
 * @param string $controller 控制器目录名(可选,默认当前控制器)
 * @param string $module    模块名(可选,默认当前模块)
 */
public function display(string $action, ?string $controller = null, ?string $module = null): bool

实战示例

  1. 指定当前控制器的其他模板

php

运行

// User控制器.php
public function infoAction() {
    // 原本默认渲染 info.phtml,现在手动渲染 list.phtml
    $this->display('list');
    // 关闭自动渲染(必须加,避免重复输出)
    $this->getView()->setAutoRender(false);
}
  1. 指定其他控制器的模板

php

运行

// User控制器的info动作,渲染 Index控制器下的index.phtml
public function infoAction() {
    $this->display('index', 'index');
}
  1. 跨模块指定模板

php

运行

// Index模块 → 渲染Admin模块的公共错误页
public function infoAction() {
    $this->display('error', 'public', 'admin');
}

方法 2:视图实例 display() 【灵活指定任意路径】

通过 $this->getView() 获取视图实例,支持相对路径、绝对路径,完美适配自定义模板目录、非标准路径的场景。

这是解决「模板不在默认目录」的终极方案!

实战示例

  1. 相对路径(基于视图脚本根目录)

php

运行

public function indexAction() {
    $view = $this->getView();
    // 渲染:application/modules/Index/views/scripts/public/header.phtml
    $view->display('public/header');
}
  1. 绝对路径(任意位置的模板)

php

运行

public function indexAction() {
    // 直接指定服务器绝对路径(适合公共模板、跨项目复用)
    $tpl = APP_PATH . '/application/views/common/foot.phtml';
    $this->getView()->display($tpl);
}

方法 3:render() 渲染模板并返回字符串

display() 直接输出页面不同,render()返回模板渲染后的字符串,适合:

  • 拼接多个模板
  • API 接口返回 HTML 片段
  • 邮件模板渲染

示例代码

php

运行

public function indexAction() {
    // 渲染模板并获取内容
    $html = $this->getView()->render('list');
    
    // 业务处理:拼接、存储、返回JSON
    $this->ajaxReturn(['html' => $html]);
}

方法 4:无文件视图|直接渲染字符串(特殊场景)

无需创建物理模板文件,直接渲染动态字符串,适合简单提示页、临时页面。

php

运行

public function testAction() {
    // 赋值变量
    $this->assign('msg', 'Yaf 手动指定视图成功!');
    // 直接渲染字符串模板
    $this->getView()->display('<h1><?php echo $msg;?></h1>');
}

三、进阶场景:非控制器中指定 View(插件 / 全局钩子)

在 Yaf 插件、路由钩子、公共函数中,无法直接使用控制器的 $this,我们可以通过调度器获取视图实例,实现全局指定模板。

示例:插件统一渲染错误页

php

运行

class ErrorPlugin extends Yaf_Plugin_Abstract {
    public function preDispatch(Yaf_Request_Abstract $req, Yaf_Response_Abstract $res) {
        // 获取调度器实例
        $dispatcher = Yaf_Dispatcher::getInstance();
        // 获取视图
        $view = $dispatcher->getView();
        
        // 全局指定错误模板
        $view->display('error', 'public', 'index');
        // 关闭自动渲染
        $dispatcher->autoRender(false);
    }
}

四、必看避坑指南(关键配置 + 注意事项)

1. 修改默认模板后缀

默认是 .phtml,可在 application.ini 中修改:

ini

; 模板后缀改为 .php
application.view.ext = "php"

✅ 指定模板时无需加后缀,Yaf 会自动拼接。

2. 必须关闭自动渲染

手动调用 display/render 后,一定要关闭自动渲染,否则会重复输出页面:

php

运行

// 控制器内
$this->getView()->setAutoRender(false);
// 全局/插件内
Yaf_Dispatcher::getInstance()->autoRender(false);

3. 模板赋值通用

无论哪种指定方式,assign() 赋值都生效:

php

运行

// 赋值
$this->assign('name', 'Yaf');
// 指定视图
$this->display('index');

4. Linux 大小写严格

模块名、控制器名、目录名全小写,否则会找不到模板!


五、实战案例:复用公共头部 / 底部

开发中最常用的场景:统一页面头部、底部,只替换内容区:

php

运行

public function indexAction() {
    $view = $this->getView();
    // 渲染公共头部
    $view->display('public/header');
    // 渲染当前页面内容
    $this->display('index');
    // 渲染公共底部
    $view->display('public/foot');
    
    $this->getView()->setAutoRender(false);
}

六、总结

最后用一张表帮大家快速选择指定方式:

表格

使用场景 推荐方法
标准路径、同控制器 / 跨控制器 $this->display()
自定义路径、绝对路径模板 视图实例 display()
获取模板内容、拼接 / 接口 render()
插件 / 全局 / 非控制器 调度器获取视图

Yaf 的视图设计极简高效:默认约定提升开发效率,手动指定满足灵活需求。掌握本文的方法,足以应对所有 Yaf 视图渲染场景~

如果大家在使用中遇到模板找不到、重复输出等问题,欢迎在评论区交流!


补充

适用版本:Yaf 3.x 全版本(PHP 7.0+)

项目结构:标准 Yaf 目录结构(application/modules 模块化)

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码