Yaf学习之控制器
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
<?php
class 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
<?php
class 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
<?php
class 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")
;
版权声明:本文为chunyuan314原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。