Thinkcmf框架 -控制器 -3

控制器 概述

1.ThinkCMF目前分为两种控制器,前台和后台控制器;
2.无论是前台,还是后台控制器都位于应用的Controller目录下.
3.前台控制器一般继承 Common\Controller\HomebaseController,如果你需要用户登录才访问或操作此控制器,就要继承 Common\Controller\MemberbaseController;

我们来创建一个前台控制器

在Blog应用Controller目录下创建一个IndexController.class.php文件
<?php
namespace Blog\Controller;
use Common\Controller\HomebaseController;

class IndexController extends HomebaseController{
    public function index(){
      echo "this is blog index !";
    }
}
访问地址:http://你的域名/?g=blog&m=index&a=index;

只让用户在登录时才能访问此控制器

只需把HomebaseController换成MemberbaseController
<?php
namespace Blog\Controller;
use Common\Controller\MemberbaseController;

class IndexController extends MemberbaseController{
    public function index(){
      echo "this is blog index !";
    }
}
这里 IndexController 下的所有方法,用户只能在登录后才能访问,否则会报错,让用户登录;

创建后台控制器

在Blog应用Controller目录下创建一IndexadminController.class.php文件(注意:这里有文件命名规则,以****adminController.class.php或 Admin****Controller.class.php命名的是后台Controller, 在后台菜单导入时会自动识别;)
<?php
namespace Blog\Controller;
use Common\Controller\AdminbaseController;

class IndexadminController extends AdminbaseController{
    public function index(){
        echo "this is admin controller!";
    }
}
访问地址:http://你的域名/?g=blog&m=indexadmin&a=index,这里你一定要先登录后台,才能访问;

控制器不用管理员登录也能被访问到

只需给IndexadminController加个空的_initialize()方法
<?php
namespace Blog\Controller;
use Common\Controller\AdminbaseController;

class IndexadminController extends AdminbaseController{

    //初始化,这里不执行父类的初始化方法
    public function _initialize(){}

    public function index(){
        echo "this is admin controller!";
    }
}

URL生成

URL生成 概述及其演示

1.ThinkCMF遵循ThinkPHP的url生成方法:
2.U方法的定义规则如下(方括号内参数根据实际应用决定):
3.U('地址表达式',['参数'],['伪静态后缀'],['是否显示域名'])
U('Blog/Index/index') // 生成Blog应用Index控制器的index操作的URL地址
U('Portal/Article/index?id=1') // 生成Portal应用Article控制器的index操作 并且参数id为1的URL地址
U('Portal/Article/index',array('id'=>1) // 生成Portal应用Article控制器的index操作 并且参数id为1的URL地址
U('User/index') // 生成当前应用的User控制器的index操作的URL地址

参数

U方法的第二个参数支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,例如:
U('Blog/Index/index',array('cat'=>1,'status'=>1))
U('Blog/Index/index','cat=1&status=1')
U('Blog/Index/index?cat=1&status=1')
添加生成带域名的 url,只要把第四个参数设置为 true
U('Blog/Index/index','cat=1&status=1',true,true)

leuu/UU方法:

为了配合后台设置的 url 美化规则,cmf 增加了 leuu/UU两个方法,UU方法只是 leuu 的别名用法一样;
leuu 的参数列表和 U 方法一样,只是要配合后台设置的 url美化规则才能生效,如没有规则,leuu 其实就是 U 方法;

url的美化规则设置:

进入ThinkCMF后台,设置->网站信息->URL美化
原始网址规则:应用名(小写)/控制器名/操作名?参数 如:portal/list/index?id=1 显示网址:英文字母加数字,不带后缀;

如:

原始网址规则:portal/list/index?id=1
显示网址:cases

leuu("portal/list/index",array('id'=>1)) //生成的 url为/cases.html

列出常用的优化方案:

portal/list/index?id=1 news   http://demo.thinkcmf.com/news.html
portal/list/index?id=2 discovery http://demo.thinkcmf.com/discovery.html
portal/page/index?id=2 contacts http://demo.thinkcmf.com/contacts.html
portal/page/index?id=14 about http://demo.thinkcmf.com/about.html
portal/article/index article/:id\d http://demo.thinkcmf.com/article/1.html
portal/list/index list/:id\d http://demo.thinkcmf.com/list/1.html

注意:

进行URL美化之后,要进入ThinkCMF后台,进行清除缓存操作后,刷新前台,才能看到美化效果。

AJAX返回

提供了ajaxReturn方法用于AJAX调用后返回数据给客户端。并且支持JSON、JSONP、XML和EVAL四种方式给客户端接受数据,并且支持配置其他方式的数据格式返回。

ajaxReturn方法调用示例:

$data = 'ok';
$this->ajaxReturn($data);

支持返回数组数据:

$data['status']  = 1;
$data['content'] = 'content';
$this->ajaxReturn($data);

默认配置采用JSON格式返回数据

通过配置DEFAULT_AJAX_RETURN进行设置,我们可以指定格式返回,例如:
// 指定XML格式返回数据
$data['status']  = 1;
$data['content'] = 'content';
$this->ajaxReturn($data,'xml');

返回数据data可以支持字符串、数字和数组、对象,返回客户端的时候根据不同的返回格式进行编码后传输。如果是JSON/JSONP格式,会自动编码成JSON字符串,如果是XML方式,会自动编码成XML字符串,如果是EVAL方式的话,只会输出字符串data数据。

JSON和JSONP的区别

JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种非官方跨域数据交互协议。一个是描述信息的格式,一个是信息传递的约定方法。

默认的JSONP格式返回的处理方法

默认的JSONP格式返回的处理方法是jsonpReturn,如果你采用不同的方法,可以设置:

'DEFAULT_JSONP_HANDLER' =>  'myJsonpReturn', // 默认JSONP格式返回的处理方法

直接在页面中用callback参数来指定。

除了上面四种返回类型外,我们还可以通过行为扩展来增加其他类型的支持,只需要对ajax_return标签位进行行为绑定即可。

跳转和重定向

页面跳转

框架内置了两个跳转方法success和error,用于页面跳转提示,而且可以支持ajax提交
$User = M('User'); //实例化User对象
$result = $User->add($data); 
if($result){
    //设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
    $this->success('新增成功', '/User/index');
} else {
    //错误页面的默认跳转页面是返回前一页,通常不需要设置
    $this->error('新增失败');
}

success和error方法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间(单位为秒),例如:

// 操作完成3秒后跳转到 /Article/index
$this->success('操作完成','/Article/index',3);
// 操作失败5秒后跳转到 /Article/error
$this->error('操作失败','/Article/error',5);

跳转地址是可选的,success方法的默认跳转地址是$_SERVER[“HTTP_REFERER”],error方法的默认跳转地址是javascript:history.back(-1);。

默认的等待时间success方法是1秒,error方法是3

success和error方法都可以对应的模板,默认的设置是两个方法对应的模板都是:

//默认错误跳转对应的模板文件
'TMPL_ACTION_ERROR' => THINK_PATH . 'Tpl/dispatch_jump.tpl',
//默认成功跳转对应的模板文件
'TMPL_ACTION_SUCCESS' => THINK_PATH . 'Tpl/dispatch_jump.tpl',

也可以使用项目内部的模板文件

//默认错误跳转对应的模板文件
'TMPL_ACTION_ERROR' => 'Public:error',
//默认成功跳转对应的模板文件
'TMPL_ACTION_SUCCESS' => 'Public:success',

模板文件可以使用模板标签,并且可以使用下面的模板变量:
这里写图片描述

success和error方法会自动判断当前请求是否属于Ajax请求,如果属于Ajax请求则会调用ajaxReturn方法返回信息。 ajax方式下面,success和error方法会封装下面的数据返回:

$data['info']   =   $message; // 提示信息内容
$data['status'] =   $status;  // 状态 如果是success是1 error 是0
$data['url']    =   $jumpUrl; // 成功或者错误的跳转地址

重定向

Controller类的redirect方法可以实现页面的重定向功能。
redirect方法的参数用法和U函数的用法一致(参考URL生成部分),例如:

//重定向到New模块的Category操作
$this->redirect('New/category', array('cate_id' => 2), 5, '页面跳转中...');

上面的用法是停留5秒后跳转到New模块的category操作,并且显示页面跳转中字样,重定向后会改变当前的URL地址。

如果你仅仅是想重定向要一个指定的URL地址,而不是到某个模块的操作方法,可以直接使用redirect函数重定向,例如:

//重定向到指定的URL地址
redirect('/New/category/cate_id/2', 5, '页面跳转中...')

Redirect函数的第一个参数是一个URL地址。

控制器的redirect方法和redirect函数的区别在于前者是用URL规则定义跳转地址,后者是一个纯粹的URL地址。

输入变量

在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了。

获取变量

虽然你仍然可以在开发过程中使用传统方式获取各种系统变量,例如:

$id    =  $_GET['id']; // 获取get变量
$name  =  $_POST['name'];  // 获取post变量
$value =  $_SESSION['var']; // 获取session变量
$name  =  $_COOKIE['name']; // 获取cookie变量
$file  =  $_SERVER['PHP_SELF']; // 获取server变量

但是我们不建议直接使用传统方式获取,因为没有统一的安全处理机制,后期如果调整的话,改起来会比较麻烦。所以,更好的方式是在框架中统一使用I函数进行变量获取和过滤。
I方法是ThinkPHP用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:

I('变量类型.变量名/修饰符',['默认值'],['过滤方法或正则'],['额外数据源'])

变量类型是指请求方式或者输入类型,包括:
这里写图片描述

注意:变量类型不区分大小写,变量名则严格区分大小写。 
默认值和过滤方法均属于可选参数。

我们以GET变量类型为例,说明下I方法的使用:

echo I('get.id'); // 相当于 $_GET['id']
echo I('get.name'); // 相当于 $_GET['name']

支持默认值:

echo I('get.id',0); // 如果不存在$_GET['id'] 则返回0
echo I('get.name',''); // 如果不存在$_GET['name'] 则返回空字符串

采用方法过滤:

// 采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
echo I('get.name','','htmlspecialchars'); 

支持直接获取整个变量类型,例如:

// 获取整个$_GET 数组
I('get.'); 

用同样的方式,我们可以获取post或者其他输入类型的变量,例如:

I('post.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_POST['name'] 进行过滤,如果不存在则返回空字符串
I('session.user_id',0); // 获取$_SESSION['user_id'] 如果不存在则默认为0
I('cookie.'); // 获取整个 $_COOKIE 数组
I('server.REQUEST_METHOD'); // 获取 $_SERVER['REQUEST_METHOD'] 

param变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:

echo I('param.id');

如果当前请求类型是GET,那么等效于 GET[id]POSTPUT _POST[‘id’] 或者 PUT参数id。

由于param类型是I函数默认获取的变量类型,因此事实上param变量类型的写法可以简化为:

I('id'); // 等同于 I('param.id')
I('name'); // 等同于 I('param.name')

path类型变量可以用于获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效),例如: 当前访问URL地址是 http://serverName/index.php/New/2013/06/01
那么我们可以通过

echo I('path.1'); // 输出2013
echo I('path.2'); // 输出06
echo I('path.3'); // 输出01

data类型变量可以用于获取不支持的变量类型的读取,例如:

I('data.file1','','',$_FILES);

变量过滤

如果你没有在调用I函数的时候指定过滤方法的话,系统会采用默认的过滤机制(由DEFAULT_FILTER配置),事实上,该参数的默认设置是:

// 系统默认的变量过滤机制
'DEFAULT_FILTER'        => 'htmlspecialchars'

也就说,I方法的所有获取变量如果没有设置过滤方法的话都会进行htmlspecialchars过滤,那么:

// 等同于 htmlspecialchars($_GET['name'])
I('get.name'); 

同样,该参数也可以设置支持多个过滤,例如:

'DEFAULT_FILTER'        => 'strip_tags,htmlspecialchars'

设置后,我们在使用:

// 等同于 htmlspecialchars(strip_tags($_GET['name']))
I('get.name'); 

如果我们在使用I方法的时候 指定了过滤方法,那么就会忽略DEFAULT_FILTER的设置,例如:

// 等同于 strip_tags($_GET['name'])
echo I('get.name','','strip_tags'); 

I方法的第三个参数如果传入函数名,则表示调用该函数对变量进行过滤并返回(在变量是数组的情况下自动使用array_map进行过滤处理),否则会调用PHP内置的filter_var方法进行过滤处理,例如:

I('post.email','',FILTER_VALIDATE_EMAIL);

表示 会对$_POST[‘email’] 进行 格式验证,如果不符合要求的话,返回空字符串。 (关于更多的验证格式,可以参考 官方手册的filter_var用法。) 或者可以用下面的字符标识方式:

I('post.email','','email');

可以支持的过滤名称必须是filter_list方法中的有效值(不同的服务器环境可能有所不同),可能支持的包括:

int
boolean
float
validate_regexp
validate_url
validate_email
validate_ip
string
stripped
encoded
special_chars
unsafe_raw
email
url
number_int
number_float
magic_quotes
callback

还可以支持进行正则匹配过滤,例如:

// 采用正则表达式进行变量过滤
I('get.name','','/^[A-Za-z]+$/');
I('get.id',0,'/^\d+$/');

如果正则匹配不通过的话,则返回默认值。
在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FILTER已经有所设置,可以使用:

// 下面两种方式都不采用任何过滤方法
I('get.name','','');
I('get.id','',false);

一旦过滤参数设置为空字符串或者false,即表示不再进行任何的过滤。

变量修饰符

最新版本的I函数支持对变量使用修饰符功能,可以更方便的通过类型过滤变量。

用法如下:

I('变量类型.变量名/修饰符')

例如:

I('get.id/d'); // 强制变量转换为整型
I('post.name/s'); // 强制转换变量为字符串类型
I('post.ids/a'); // 强制变量转换为数组类型

可以使用的修饰符包括:
这里写图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值