控制器


控制器(Controller)和动作(Action)创建规则

控制器本质是一个 Class 类,类的命名需要开头字母大写,并创建在应用的 Controller 目录中,文件名与类名保持一致,同样要开头字母大写,以 .php 扩展名结尾,例如:

myapp/Controller/Index.php

控制器类需要在代码顶部声明命名空间,并且需要继承 MiniFramework 框架的 Mini\Base\Action 核心类。控制器类中的方法对应控制器的动作,动作方法的命名需要以 Action 结尾,示例代码如下:

// 声明命名空间
namespace App\Controller;

// 引入 Action 核心类
use Mini\Base\Action;

/**
 * 这是一个名为 Index 的控制器类,需要继承 Action 核心类
 */
class Index extends Action
{    
    /**
     * 默认动作
     */
    function indexAction()
    {
        // 在这里写动作方法的代码
    }
}

默认控制器和默认动作

MiniFramework 对于控制器和动作的命名保留有默认控制器和默认动作方法,命名为 Index 的控制器类,为默认控制器类,命名为 indexAction() 的动作方法,为默认动作方法,在访问请求的 URL 中可以省略,例如:

http://你的域名/index.php?c=index&a=index

上边的访问请求地址中,index.php为应用的入口文件(通常这部分也可以省略),后边的参数 c=index 表示向名为 index 的控制器发起请求,第二个参数 a=index 表示执行名为 index 的动作方法,按照规则可以省略简写为:

http://你的域名/index.php

框架会自动去寻找默认的 Index.php 控制器类,并且也会自动在控制器类中寻找并调用名为 indexAction() 的默认动作方法。因此,请求参数 ?c=index&a=index 在 URL 中可被省略。

控制器的初始化(init)

MiniFramework 的控制器支持初始化方法,开发者可在控制器类中创建一个名为 _init() 的方法,这个方法的执行优先级高于其他动作方法,当框架发现控制器类中存在 _init() 方法时,会优先执行 _init() 然后在执行请求的动作方法,示例代码如下:

namespace App\Controller;

use Mini\Base\Action;

class Index extends Action
{
    public $num = 0;

    /**
     * 初始化方法
     */
    function _init()
    {
        $this->num ++;
    }

    function indexAction()
    {
        $this->num ++;
        echo $this->num;
        die();
    }
}

上边的代码演示了控制器初始化的过程,向 index 动作发起请求,框架会在执行对应的 indexAction() 方法前,优先执行 _init() 方法,在 indexAction() 方法执行完毕后,会在浏览器上显示结果为2。

控制器和动作的内部跳转(forward)

MiniFramework 在 Mini\Base\Action 核心类中提供了用于内部跳转的 forward() 方法。通过此方法,开发者可在控制器中将当前请求进行内部跳转,并且这种跳转属于隐性跳转,仅在内部执行,浏览器地址栏不会发生变化,示例代码如下:

namespace App\Controller;

use Mini\Base\Action;

class Index extends Action
{
    public $info;


    function indexAction()
    {
        // 内部跳转至名为 show 的动作方法,第二个参数为控制器名,当前控制器可省略
        $this->forward('show', 'index');
    }

    function showAction()
    {
        echo 'Show';
        die();
    }
}