Yaf学习之控制器

来源:互联网 发布:数据库如何检索字符串 编辑:程序博客网 时间:2024/05/17 07:27

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

<?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
原创粉丝点击