热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Yaf学习之控制器

Yaf中的控制器:必须是Yaf_Controller_Abstract的子类类名要以Controller结尾,保存的文件名则不需要执行的动作对应的方法名称要以Action结尾

Yaf中的控制器:

  • 必须是Yaf_Controller_Abstract的子类
  • 类名要以Controller结尾,保存的文件名则不需要
  • 执行的动作对应的方法名称要以Action结尾
  • init()方法是控制器被实例化时自动调用的方法,而不是__construct(),所以整个控制器的初始化代码要放在这里。

一、Yaf控制器常用方法一览表

序号 方法名称 作用
1 getModuleName() 获取当前所在模块的名称
2 getViewPath() 获取视图路径
3 render(string $tpl, [, array $params]) 渲染一个视图,返回一个Yaf_Response_Abstract实例
4 display(string $tpl, [, array $params]) 渲染一个视图并输出
5 forward(string $module [,string $controler [, string $action [, array params]]]) 引发一下一轮dispatch循环
6 redirect(string $url) 引发一个302重定向,重定向到另一个url
7 getRequest() 返回一个Yaf_Request_Abstract实例
8 getResponse() 返回一个Yaf_Response_Abstract实例
7 getView() 返回一个Yaf_View_Interface实例

二、测试代码

编写了几个控制器来测试以上方法:

1. application/controllers/Index.php



class IndexController extends Yaf_Controller_Abstract
{

public function init(){
echo __METHOD__, "
"
;
}

public function indexAction()
{

echo __METHOD__, "
"
;
echo "module: ", $this->getModuleName(), "
"
;
echo "params: ";
print_r($this->getRequest()->getParams());
echo "
"
;

echo "view path: ", $this->getViewPath(), "
"
;
echo "rendered view: ";
echo $this->render('index', ['content' => 'using render() method']);

$this->display('index', ['content' => 'using display() method']);

echo "
"
;
$this->forward('user', 'index');
}

public function forwardAction()
{

echo __METHOD__, "

"
;
$this->forward('index', ['id' => 3, 'name' => 'jack']);
}
}

2. application/controllers/User.php



class UserController extends Yaf_Controller_Abstract
{

public function indexAction()
{

echo __METHOD__, "

"
;

Yaf_Dispatcher::getInstance()->enableView();
$this->getView()->assign('content', 'In UserController');

$this->forward('app', 'goods', 'index');
}
}

3. application/modules/app/controllers/Goods.php



class GoodsController extends Yaf_Controller_Abstract
{

public function indexAction()
{

Yaf_Dispatcher::getInstance()->disableView();
echo __METHOD__, "
"
;
}
}

4. Bootstrap.php

为了测试方便,在Bootstrap.php中禁用视图,输出由我们自己控制,需要的时候才开启。

    public function _initOne(Yaf_Dispatcher $dispatcher)
{

$dispatcher->disableView();
}

三、测试与分析

访问yaf.cc/index/forward:
这里写图片描述

  • 我们访问的是 /index/forward,理所当然,index控制器的forward动作被执行,执行之前,init()被执行了。
  • forward动作中,$this->forward('index', ['id' => 3, 'name' => 'jack']); 转发到index动作,并传了两个参数过去。
  • 于是index动作执行了,init()方法又执行了一次。index动作中我们用getModuleName()方法获得当前模块为Index,然后$this->getRequest()->getParams(),获取Yaf_Request_Abstract实例,再通过它获取路由解析的参数。通过getViewPath()方法获取到了视图路径,该视图路径并不包含控制器名index。调用render()渲染视图,然后用echo 手动输出。调用display()方法,渲染的结果被自动输出。最后,这行代码$this->forward('user', 'index');将当前的控制流程转发到user控制器的index方法。
  • user控制器中的index动作如期执行。该动作中,$this->getView()->assign('content', 'In UserController');,这行代码是获取视图并给content变量赋值,但是视图渲染结果并没有在该动作中输出。
    $this->forward('app', 'goods', 'index');这行代码将当前控制器流程转发到app模块下的goods控制器中的index动作。
  • app模块下的goods控制器中的index动作被执行,由于这是最后一个控制流程了,之前user控制器中index动作渲染的视图被输出到浏览器。

四、redirect()方法

前面说道,Yaf 控制器实例的redirect()方法引发一个302重定向(这是我从浏览器中观察得出的),使用方法跟其它PHP框架类似:

  • 重定向到一个应用外部的url(用全路径):
    $this->redirect("http://www.baidu.com");
  • 重定向到另外一个控制器或模块(用绝对路径):
    $this->redirect("/app/goods/index");
    $this->redirect("/user/index");
  • 重定向到同一个控制器的动作(相对路径):
    $this->redirect("index");

推荐阅读
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 使用cpphttplib构建HTTP服务器以处理带有查询参数的URL请求 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
  • 微信支付授权目录配置详解及操作步骤
    在使用微信支付时,若通过WeixinJSBridge.invoke方法调用支付功能,可能会遇到“当前页面URL未注册”的错误提示,导致get_brand_wcpay_request:fail调用微信JSAPI支付失败。为解决这一问题,需要正确配置微信支付授权目录,确保支付页面的URL已成功注册。本文将详细介绍微信支付授权目录的配置步骤和注意事项,帮助开发者顺利完成支付功能的集成与调试。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • 本文详细解析了 MySQL 5.7.20 版本中二进制日志(binlog)崩溃恢复机制的工作流程。假设使用 InnoDB 存储引擎,并且启用了 `sync_binlog=1` 配置,文章深入探讨了在系统崩溃后如何通过 binlog 进行数据恢复,确保数据的一致性和完整性。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
author-avatar
书友59418658
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有