Git --NB Framework 中文教程
目录 ▾ 简单访问

最后更新于:2018-09-12 10:44
70次阅读0条评论

简单访问

本章节会简单介绍MVC环节中的控制器的使用,方便阅读后面的教程时,可以自己运行例子代码体验。

控制器是NB里很重要的一个环节,负责直接面对用户的请求和反馈用户请求的重任,所以为了安全,我们对它的命令空间有一定的要求,下面会讲到。

注意,NB里的控制器本身可以不需要继承任何类,不需要任何依赖。当然为了方便使用,你可以继承nb\Controller类来加快开发速度。
这里讲的是不继承nb\Controller类的控制器用法,

写一个最简单的控制器

控制器一般是在应用目录application下的controller目录里。如下,我我们编写一个Test控制器,它的目录结构应是:

// Test控制器位置
/home/www/demo/application                      
 ├─controller                      
 │  ├─Test.php

注意:控制器的文件名要和类名保持一致,包括大小写。
我们来看看控制器里的代码:

namespace controller;

class Test {

     //访问地址:http://demo.ol.cx/test/index
     //控制器的默认访问函数就是index,因此下面的访问也是同样的
     //http://demo.ol.cx/test
    public function index(){
        ex('Hello NB');
    }

    //访问地址:http://demo.ol.cx/test/nbcx
    public function nbcx() {
        ex('Hello NBCX');
    }
}

添加其它控制器目录

有时我们有这样的需求,我们要做一个简单的博客系统,这就包括前端的展示和后端的管理。
如果所有的控制器都放在..\application\controller目录下,显然很不利于管理和维护。
此时,我们可以在其下面新建一个控制器文件夹单独存放后台管理控制器,如..\application\controller\admin

/home/www/demo/application                      
 ├─controller   
 │  ├─admin  
 │  │  ├─Test.php                 
 │  ├─Test.php

此时,要注意控制器的命名空间的书写规则,命名空间必须是controller\文件夹名如下:

namespace controller\admin;

class Test {

    //访问地址:http://demo.ol.cx/admin/test/index
    //不能省略index
    public function index(){
        e('Hello Admin Test!');
    }
}

因为框架是按照URL以/切割后的长度来定位非默认控制器文件夹
所以此处访问地址中不能省略默认控制器函数

当然,如果你觉得把admin放在controller目录下,目录层级过深,也可以放在application目录下,和controller同级。
比如我们新建一个api的控制器文件夹,专门管理博客提供的接口。

/home/www/demo/application                      
 ├─api  
 │  ├─Test.php 
 ├─controller
 │  ├─admin  
 │  |  ├─Test.php                    
 │  ├─Test.php 

此时,控制器的命名和放在controller下的规则是一样的
并且,如果你在controller目录下也建了一个api的控制器文件夹,它的优先级别是低于在application目录下的控制器。
也就是框架会先加载..\application\api下的控制器,加载失败才会继续加载..\application\controller\api下的控制器。

namespace controller\api;

class Test {

    //访问地址:http://demo.ol.cx/api/test/index
    //同样不能省略index
    public function index(){
        e('Hello Api Test!');
    }
}

自动传参

为了方便,如果控制器函数定义了参数,框架会自动填充。填充的来源通常为$_REQUEST。
如下面:

namespace controller;

class User {
    public function index($id=1) {
        ex("ID is {$id}");
    }
}

当我们访问地址http://demo.ol.cx/user时,浏览器上将显示:

ID is 2

当我们访问地址http://demo.ol.cx/user?id=12时,浏览器上将显示:

ID is 12

我们也可以指定参数的填充来源,只需要

class User {
    public $_method = 'post';
    public function index($id=1) {
        ex("ID is {$id}");
    }
}

如上,此时填充数据只会从$_POST里获取,我们http://demo.ol.cx/user?id=12时,将显示:

ID is 2

_method可设置的值可以参考请求章节

参数过滤

我们可以对自动传参的参数进行过滤,这里简单下怎么使用,详细可以参考数据校验章节

namespace controller;

class Simple {

    //验证规则,定义方式同验证器一样,只是定义属性前需要加下划线
    public $_rule = [
        'name'  =>  'require|max:25',
        'age'   => 'number|between:1,120',
        'email' =>  'email',
    ];

    //验证错误提示,省略的话,使用验证器的内置提示
    //定义方式同验证器一样,只是定义属性前需要加下划线
    public $_message  =   [
        'name.require' => '名称必须',
        'name.max'     => '名称最多不能超过25个字符',
        'age.number'   => '年龄必须是数字',
        'age.between'  => '年龄只能在1-120之间',
        'email'        => '邮箱格式错误',
    ];

    /**
     * 验证失败的回调函数
     * 如果省略此函数,框架自动使用内置的错误回调处理
     * @param $error 错误信息
     * @param $filed 错误字段
     */
    public function __error($error,$filed) {
        e($error,$filed);
    }

    public function index($name=null) {
        e($name);
    }

}

访问:http://demo.ol.cx/simple,浏览器会显示:

string(12) "名称必须"
string(4) "name"

访问:http://demo.ol.cx/simple?name=123,浏览器会显示:

string(3) "123"

前置和后置方法

NB为控制器类提供了两个魔术方法__before__after,我们可以根据需要用或不用。

class User {

    //将在执行任何控制器方法之前调用
    //如果返回false,将不执行控制器方法
    public function __before() {
        ex("__before");
        return true;
    }

    public function index($id=1) {
        return "__after show {$id}";
    }

    //将在执行任何控制器方法之后调用
    //并将控制的返回值作为参数传给它
    public function __after($data) {
        ex($data);
    }
}

此时访问http://demo.ol.cx/user时,浏览器上将显示:

__before
__after show 1

上一篇:响应输出
下一篇:重定向

相关评论

您需要登录后才可以发表评论