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 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>