一.控制器的定义
一般来说,ThinkPHP的控制器是一个类文件,而操作则是控制器的一个公共方法,一般按照大驼峰的风格来命名
控制器(类文件)声明
首先要写一个命名空间(命名空间一般以模块名\所在的文件夹名组成)
namespace Home\Controller
然后要带导入类文件继承的父类(命名空间名\类文件名)
use Think\Controller
最后声明所使用的类继承导入进来的父类,然后在类中写相对应的方法
class IndexController extends Controller {
public function hello(){
echo 'hello,thinkphp!';
}
}
注意:定义控制器方法的时候,尽量避免和系统的方法名向冲突,(除非你非常明确自己在做什么),
这些保留方法名包括但不限于:
display get show fetch theme assign error success
因为操作方法就是控制器中的方法,所以遇到有和系统的关键字冲突的方法可能就不能定义了
可以设置操作方法的后缀来解决:
操作方法后缀
'ACTION_SUFFIX' => 'Action',
设置操作方法的后缀为Action,这样,控制器的操作方法定义调整为:每个控制器名后面加上一个Action后缀
如果你在空间中命名了这些系统方法,你在调用系统中的方法,他会先找自己空间下有没有这个空间,如果有
他会执行当前空间下的方法,而不会执行系统中的方法,所以为了不让系统中的方法失效,我们命名方法的时候尽量
避免这些关键字
二.多层控制器
意思就是对控制器进行分类:一般情况下分为两类,一类是执行展示的控制器,一类是事件控制器,事件控制器用户不能
之间访问,而要通过别的控制器调取他的方法访问 控制器的名称是通过DEFAULT_C_LAYER设置的,默认是Controller。
三.多级控制器
多级把控制器分为多级,我们需要哪个级里的文件夹,直接访问那个级里的类文件,这样分层,看起来结构更加清晰
更容易管理
例:多级控制器是指控制器可以通过子目录把某个控制器层分组存放,首先需要设置控制器的分级层次,
我们设置2级目录的控制器层:'CONTROLLER_LEVEL' => 2,把这个写到配置文件用
如果你把控制器文件分为两级,一级下如果有类文件就不能进行访问了,所以要根据自己的需求来分配,一般建议
分为一级就好
四.前置操作
当你要执行一个方法的是时候,需要在这个方法前面或者后面自动执行写方法的时候,可以使用before(前置)或者
after(后置)关键字来进行操作
例:
//前置操作
public function _before_test(){
echo '我是前置操作';
}
public function test(){
$this->show('这是一个新增页面'.$_GET['id']);
}
//后置操作
public function _after_test(){
echo '我是后置操作';
}
这两个关键字只针对你写那个方法会自动执行,如果你想在所有方法执行前都想执行一段代码的时候
可以使用_initialize()这个方法,他会在所以方法之前都执行一下这个方法里的代码
比如每个页面都需要头部和尾部就可以使用这个方法
五.参数绑定
Action参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数,可以简化方法的定义甚至路由的解析。
Action参数绑定功能默认是开启的,其原理是把URL中的参数(不包括模块、控制器和操作名)和操作方法中的参数进行绑定。
要启用参数绑定功能,首先确保你开启了 URL_PARAMS_BIND 设置: 'URL_PARAMS_BIND' => true,
参数绑定有两种方式:按照变量名绑定和按照变量顺序绑定。
按变量顺序绑定:
第二种方式是按照变量的顺序绑定,这种情况下URL地址中的参数顺序非常重要,不能随意调整。要按照变量顺序进行绑定,
必须先设置 URL_PARAMS_BIND_TYPE 为1:'URL_PARAMS_BIND_TYPE' => 1
六.Url生成
定义规则
U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])
大U方法能自动生成你想要的各种路径名,地址表达式从模块开始写后面跟控制器和方法名
参数你想传的值,伪静态后缀名,写上可以保护你的url路径,显示域名如果不写就是你当前的域名
传参方式有两种方式:一种是直接传参,也可以写成数组的方式来进行传参,写成数组的方式比较安全
可以防止别人的恶意攻击
使用大U方法来进行页面跳转,如果想在模块中使用大U方法就在U前面加上:就好了,然后就可以实现页面跳转
而且可以进行传值
七.伪静态
伪静态为了保护自己的url路径不被别人知道网站的目录结构,和自己的网页什么语言开发的,可以使用这个伪静态
来对网站进行处理
设置网站后缀名:'URL_HTML_SUFFIX'=>'shtml'
也可以设置没有后缀名:'URL_HTML_SUFFIX'=>''
常量__PUBLIC__可以自动找到public文件夹中的东西
八.TP之AJAX技术
TP框架提供了很好的AJAX技术,使用TP框架,不用写数据类型,只用执行代码就行了,不用考虑别的问题,TP框架
提供了一个方法来返回给前端数据:$this->ajaxReturn()
九.跳转与重定向
系统的\Think\Controller类内置了两个跳转方法success和error,用于页面跳转提示,而且可以支持ajax提交.
而且支持数组传输
success和error方法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间(单位为秒)
例:// 操作完成3秒后跳转到 /Article/index
$this->success('操作完成','/Article/index',3);
// 操作失败5秒后跳转到 /Article/error
$this->error('操作失败','/Article/error',5);
可以再应用配置文件中对跳转的模板进行修改
//默认错误跳转对应的模板文件
'TMPL_ACTION_ERROR' => 'Public:error',
//默认成功跳转对应的模板文件
'TMPL_ACTION_SUCCESS' => 'Public:success',
然后在相对应的两个位置建相对应的模板
模板文件可以使用模板标签,并且可以使用下面的模板变量:
$message
页面提示信息
$error
页面错误提示信息
$waitSecond
跳转等待时间 单位为秒
$jumpUrl
跳转页面地址
重定向
Controller类的redirect方法可以实现页面的重定向功能
redirect方法的参数用法和U函数的用法一致(参考URL生成部分)
这个方法可以生成进行跳转
例:$this->redirect('New/category', array('cate_id' => 2), 5, '页面跳转中...');
十.输出变量
I方法是ThinkPHP用于更加方便和安全的获取系统输入变量:
I('变量类型.变量名/修饰符',['默认值'],['过滤方法或正则'],['额外数据源'])
get 获取GET参数
post 获取POST参数
param 自动判断请求类型获取GET、POST或者PUT参数
request 获取REQUEST 参数
put 获取PUT 参数
session 获取 $_SESSION 参数
cookie 获取 $_COOKIE 参数
server 获取 $_SERVER 参数
globals 获取 $GLOBALS参数 拿全局的
path 获取 PATHINFO模式的URL参数 拿?号下的值
data 获取 其他类型的参数,需要配合额外数据源参数
变量过滤:
如果你没有在调用I函数的时候指定过滤方法的话:
系统默认的变量过滤机制
'DEFAULT_FILTER' => 'htmlspecialchars'
同样,该参数也可以设置支持多个过滤,例如:
'DEFAULT_FILTER' => 'trim,htmlspecialchars'
一般可以加上trim,把空格去掉
Web开发最常见的就是HTTP(超文本传输协议)通信协议,该协议(HTTP)设计的目的是确保
服务器与客户端之间的正确通信,其中最主要的4种方法:get,post,put,delete
1.Http get 方法: 主要用于向指定的URL(URI)请求资源(资源文件或是数据均可)
2.Http post方法:主要是向指定的URL(URI)提交数据, 通常用于表单发送,
post所传递的数据或参数不是已明文形式存在的,而是封装后的,因此相对安全系数高
3.Http put方法: 功能跟post相似,用来将信息放到请求的URL(URI)上,put方法是幂等方法,
post非幂等方法,put在请求时容易造成数据冗余,而post则不然
4.Http delete方法: 用于删除请求URL上的某个资源, 该请求返回状态有3.
200:表示删除请求被成功执行,返回被删除的资源
202:表示删除请求被接受,但还没有被执行
204:表示删除请求被执行,但没有返回被删除的资源
例:
echo I('get.id'); // 相当于 $_GET['id']
echo I('get.name'); // 相当于 $_GET['name']
如果拿值想把所有的值都拿到只需要在拿值方法后面加一个点
支持默认值:
echo I('get.id',0); // 如果不存在$_GET['id'] 则返回0
变量修饰符:
I('变量类型.变量名/修饰符')
s 强制转换为字符串类型
d 强制转换为整型类型
b 强制转换为布尔类型
a 强制转换为数组类型
f 强制转换为浮点类
例:
I('get.id/d'); // 强制变量转换为整型
I('post.name/s'); // 强制转换变量为字符串类型
I('post.ids/a'); // 强制变量转换为数组类型
十一.请求类型
我们需要判断当前操作的请求类型是GET 、POST 、PUT或 DELETE,
一方面可以针对请求类型作出不同的逻辑处理,另外一方面有些情况下面需要验证安全性,过滤不安全的请求
IS_GET 判断是否是GET方式提交
IS_POST 判断是否是POST方式提交
IS_PUT 判断是否是PUT方式提交
IS_DELETE 判断是否是DELETE方式提交
IS_AJAX 判断是否是AJAX提交
REQUEST_METHOD 当前提交类型
可以利用请求类型,做来判断POST让提交数据,GET的话就让他展示数据
十二.空方法操作
空操作是指系统在找不到请求的操作方法的时候,会定位到空操作( _empty )方法来执行,
利用这个机制,我们可以实现错误页面和一些URL的优化。
例:
public function _empty($name){
$this->show("你访问的{$name}不存在");
$this->test3();
}
十三.空控制器操作
空控制器的概念是指当系统找不到请求的控制器名称的时候,系统会尝试定位空控制器(EmptyController)
此常量CONTROLLER_NAME可以拿控制器的名称
例:
class EmptyController extends Controller{
public function _empty($name){
$this->show("访问的{$name}不存在");
}
}
十四.实例化控制器
你需要跨控制器调用的话,则可以单独实例化:
假设当前模块是Home模块
$User = A('User');
$Blog = A('Admin/Blog');
// 假设当前模块是Home模块
// 实例化Event控制器
$User = A('User','Event');
$Blog = A('Admin/Blog','Event');
跨模块调用控制器:
public function test3(){
$homeIndexObj=A("Home/index");
$homeIndexObj->index();
}