Yaf学习之控制器
来源:互联网 发布:数据库如何检索字符串 编辑:程序博客网 时间:2024/05/17 07:27
Yaf中的控制器:
- 必须是Yaf_Controller_Abstract的子类
- 类名要以Controller结尾,保存的文件名则不需要
- 执行的动作对应的方法名称要以Action结尾
- init()方法是控制器被实例化时自动调用的方法,而不是__construct(),所以整个控制器的初始化代码要放在这里。
一、Yaf控制器常用方法一览表
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
<?phpclass IndexController extends Yaf_Controller_Abstract{ public function init(){ echo __METHOD__, "<br/>"; } public function indexAction() { echo __METHOD__, "<br/>"; echo "module: ", $this->getModuleName(), "<br/>"; echo "params: "; print_r($this->getRequest()->getParams()); echo "<br/>"; echo "view path: ", $this->getViewPath(), "<br/>"; echo "rendered view: "; echo $this->render('index', ['content' => 'using render() method']); $this->display('index', ['content' => 'using display() method']); echo "<hr/>"; $this->forward('user', 'index'); } public function forwardAction() { echo __METHOD__, "<br/><hr/>"; $this->forward('index', ['id' => 3, 'name' => 'jack']); }}
2. application/controllers/User.php
<?phpclass UserController extends Yaf_Controller_Abstract{ public function indexAction() { echo __METHOD__, "<br/><hr/>"; Yaf_Dispatcher::getInstance()->enableView(); $this->getView()->assign('content', 'In UserController'); $this->forward('app', 'goods', 'index'); }}
3. application/modules/app/controllers/Goods.php
<?phpclass GoodsController extends Yaf_Controller_Abstract{ public function indexAction() { Yaf_Dispatcher::getInstance()->disableView(); echo __METHOD__, "<br/>"; }}
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")
;
0 0
- Yaf学习之控制器
- Yaf学习之路由
- Yaf学习之Bootstrap
- Yaf学习之Request
- Yaf学习笔记之Yaf_View_Simple
- Yaf学习之Action类
- Yaf学习之整合yii
- 学习yaf
- Yaf 学习笔记之------assign使用
- Yaf学习笔记之钩子与插件
- 自学php之YAF!什么是YAF?
- yaf框架控制器中的几个函数
- Yaf之Hello World
- S3C2440学习之存储控制器
- unity学习之角色控制器
- yaf
- yaf
- php yaf 框架 学习资源
- PBC库传入参数文件问题
- WebService 的创建,部署和使用
- JAVA监视某文件夹并对文件夹里的文件做操作
- 数十种TensorFlow实现案例汇集:代码+笔记
- struts2之日期类型转换
- Yaf学习之控制器
- 实现一个简单的栅格系统
- [LeetCode]53. Maximum Subarray
- Linux下编译C语言程序
- Hyperledger Fabric 1.0 快速部署
- 数据库-SQL语句练手
- HDU1542
- Iterator的源码解析
- 首先执行js再进行href跳转