1、控制器操作
1、控制器操作
第一步:控制器默认创建在当前模块下的Controller目录下
第二步:按照指定的命名规则:控制器名(首字母大写)+controller.class.php
第三步:控制器里的方法必须是public公共的
//控制器
class UserController extends Controllr(){
public function index(){
//index()方法在URL访问时可以忽略
}
}
URL访问:http:localhost/demo/User/index/
有时方法名可能和关键字冲突,那么定义起来就比较麻烦,控制器提供了一个配置定义:
//配置控制器方法后缀
‘ACTION_SUFFIX’=>Action,
//每个方法后面加上Action ,对于URL访问不需要加Action
class UserController extends Controllr(){
public function indexAction(){
//index()方法在URL访问时可以忽略
}
}
默认情况下通过URL访问的页面是控制器模块下的方法,即:controller目录下的UserController.class.php类,他是对外公开可访问的,我们可以成为访问控制器,那么很多时候,由于项目业务的高度繁杂,我们可能想法法很多业务分离到另外的层,比如事件控制层,那么可以这么操作
第一步:创建时间控制器目录:Event
第二步:创建UserEvent.class.php类
//是否继承控制器基类或者其他的类,取决于你的业务
class UseEvent extends Controller{
public function test(){
echo '这是事件控制器层的封装,不对外公开,属于内部调用'
}
}
在其他对外公开的类里面进行调用可以输出
class UserController extends Controllr(){
public function test(){
$userEvent = new UserEvent();
$userEvent->test();
echo 'test';
}
}
PS:这里调用别的控制器还可以使用快捷键调用方法A()。
$userEvent = A('User' , 'Event');
$userEvent = A('Admin/User' , 'Event'); //增加模块
默认情况下,控制器只支持一级控制器,当项目较为复杂的时候,想创建同意模块下多个控制器时,可以配置二级控制器
第一步:配置允许二级控制器
//允许配置二级控制器
‘CONTROLLR_LEVEL’=>2
第二步:在Controller目录下创建User目录,在User目录下创建一个控制器,
//二级控制器写法
namespace Home\Controller\User
user Think\Controller;
class MemberController extends Controller{
public function index(){
echo '多级控制器'
}
}
ThinkPHP 控制器还提供了两个特殊的方法目前只操作方法_before_index()和后置操作方法_after_index()这两个方法,在控制器调用index()方法的时候,一个在之前执行,一个在之后执行
public function _before_index(){
//在之前执行
}
public function _after_index(){
//在之前执行
}
2、Action参数绑定
参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数,可以简书方法的定义甚至路由的解析
//启动Action参数绑定,默认为true,可以不写
‘URL_PARAMS_BIND’=>true
//变量名为$id
class UserController extends Controller{
public function index($id){
echo 'id:'.$id;
}
}
URL http://localhost/demo/index/id/3
PS:当你URL没有传递参数(id/4)的时候,那么页面会报错,参数错误或者未定义:id 当然如果取消绑定,则不会报错‘URL_PARAMS_BIND’=>false 但是,为了程序的严谨性,一般需要要取消参数绑定
如果你那个参数设定一个默认值,当没有传递参数的时候,慧直接启用默认值,
//给变量$id 设置默认值
public function index($id=1)
还有一种是按顺序传递参数,这个方法可以省略掉键值对中的键,也就是说id不需要传递,只需要传递5这个值即可,但必须按照多个参数的顺序
//定义按照顺序传参绑定
‘URL_PARAMS_BIND_TYPE’=>1
//传递两个参数
class UserContrroller extends Controller(){
public function index($id ,$type){
echo 'id:' . $id . ' type:' .$type;
}
}
3、跳转与重定向
ThinkPHP在操作数据库时,需要跳转和重定向页面,ThinkPHP提供了一组方法来解决了这个问题
//成功和失败的跳转
class UserController extends Controller{
public function index(){
$flag = true;
if($flag){
//会跳转到:http://localhost/demo/User/all
$this->success('新增成功' , ‘../User/all’);
}else{
//会跳转到本页的上一页
$this->error('新增失败')
}
}
}
PS:success()方法和error()方法,第一个参数是提示信息,第二个跳转的地址、第三个跳转时间、默认情况下success()方法是1秒,error()方法是3秒
//设置5秒
$this->success('新增成功' , 'list' , 5);
success()方法和error()方法,跳转的时候就对应了相应的末班吗,默认如下:
//默认错误跳转对应的模板文件
‘TMPL_ACTION_ERROR’=>THINK_PATH .'Tpl/dispatch_jump.tpl'
//默认成功跳转对应的模板文件
‘TMPL_ACTION_SUCCESS’=>THINK_PATH .'Tpl/dispatch_jump.tpl'
//自定义成功和错误提示模板页面 公共的配置文件中写
'TMPL_ACTION_SUCCESS'=>'Public/sucess',
‘TMPL_ACTION_ERROR’=>'Public/error',
对于自定义的提示模板,ThinkPHP提供了一组变量可供使用
//直接在自定义的模板中使用这些变量。
$msgTitle 操作标题
$message 页面提示信息
$status 操作状态1 表示成功0 表示失败
$waitSecond 跳转等待时间 单位为妙
$jumpUrl 跳转页面地址
PS:如果对于数据库操作,采用了Ajax,那么success()和error()会自动ajaxReturn()方法返回数据提供调用
ThinkPHP还单独提供了重定向方法redirect(),参数和U()方法一样,这个方法使用的URL规则
$this->redirect(‘User/test’ , arrar('id'=>5) , 5 , '页面跳转中。。。');
//如果只是想纯粹的URL跳转 ,不去使用URL规则 ,那么直接使用redirect()函数,
redirect('http://www.baidu.com' , 5 , '页面跳转中。。');
4、输入变量
我们在获取系统变量或者用户提交的数据时,这些变量数据错综复杂,一不小心就容易引擎安全隐患,所以,ThinkPHP提供 了轻松和安全取变量的解决方案。
//常规获取变量方式
$id = $_GET['id']; //获取get变量
$name = $_POST['name'] //获取post变量
$value = $_SESSIONM['var']; //获取session变量
$name = $_COOLIE['name']; //获取cookie变量
$file = $_SERVER['PHP_SELF']; //获取server变量
PS:在ThinkPHP中,我们不在建议直接使用传统方式获取,因为没有统一的安全处理机制,后期调整也会比较麻烦,所以ThinPHP提供I()方法进行变量的获取和过滤。
I()方法的格式:I(‘变量类型,变量名’ ,['默认值'] ,[‘过滤方法’])
get 获取GET参数
post 获取POST参数
param 自动判断请求类型获取GET POST 或者PUT参数
request 获取REUQUEST
put 获取PUT参数
session 获取$_SESSION参数
cookie 获取$_COOKIE参数
server 获取$_SERVER参数
globals 获取$_GLOBALS参数
//获取$_GET['id'];
echo I('get.id');
//$_GET['id']没有值 则默认1
echo I('get.id' , 1);
//过滤$_GET['id'];
echo I('get.id' , '' , 'md5');
//获取$_GET;
print_r(I('get .'));
PS:其他几个系统变量均采用以上方式
ThinkPHP还提供了一个自动识别各种系统变量类型的接受方法:param
//param变量自动判断变量类型
echo I('param.id');
//param可以省略
echo I('id');
如果是PATHINFO模式的URL param也可以接受
//param获取URL所有参数
print_r(I('param.0'));
PS:取消和开启URL的URL_PARAM_BIND_TYPE=>1配置定义,在访问这个URL得时候结果有所不同,
关闭URL传参顺序:Array([id] = 5 [type] => a)
开启URL传参顺序:Array([0]=>id[1]=>5[2]=>type[3]=>a)
//param获取指定参数值
echo I('param.id');
echo I('param.type');
默认情况下 IO的默认过滤是:htmlspecialchars,过滤掉HTML
//过滤HTML 如果去掉了,则传递包含html的字符串,将不过滤
‘DEFAULT_FILTER’=>'htmlspecialchars'
当然如果不过滤,也可以在程序中过滤
//设置过滤函数,会忽略配置文件里的配置
echo I('get.id' , '' , 'htmlspecialchars');
如果系统设置了默认的过滤,本身某个函数又不想过滤那么可以这么处理
//设置屏蔽系统默认过滤
echo I('get.id' , '' ,false); //第三参数为空字符串均可
5、请求类型
ThinkPHP提供了一组常量来判断当前请求是否是GET/POST等。通过判断请求处理不同的业务逻辑
IS_GET 判断是否GET提交请求
IS_POST 判断是否POST提交请求
IS_PUT 判断是否PUT提交请求
IS_DELTE 判断是否DELTE提交请求
IS_AJAX 判断是否AJAX提交请求
//判断是不是GET请求
if(IS_GET){
echo '是GET请求'
}else{
echo ‘不是GET请求’
}
6、空操作
空操作是指系统在找不到请求的操作方法时,慧定位到空操作(_empty)方法来执行。利用这个机制,我们可以实现错误页面和一些URL的优化
//如果没有相关方法则执行
public function _empty(){
//连接符 .
//方法名 ACTION_NAME
echo ‘找不到’ .ACTION_NAME.方法
}
7、空控制器
所谓空控制器,就是请求不到指定控制器时,调用一个专门的空控制器,利用这个机制,我们可以实现错误页面和一些URL的优化
//如果没有相关控制器则执行
class EmptyController extends Controller{
public function index(){
echo '找不到控制器' . CONTROLLER_NAME;
}
}
8、操作绑定到类
项目大的时候可以用到这功能。
TinkPHP提供了把每个操作方法定位到一个类的功能,即每个吧层次分的更加细腻
//设置操作绑定到类
‘ACTION_BINGD_CALSS’=>Ture
然后,在Controller目录下简历User目录,在User目录下简历index.class.php 再建立test.class.php
//index.class.php
namespace Home\Controller\User;
user Think\Controller
class index extends Controller(){
public function run(){
echo 'User模块下的index类'
}
}
//test.class.php
namespace Home\Controller\User;
user Think\Controller
class test extends Controller(){
public function run(){
echo 'User模块下的test类'
}
}
//空控制器 可以创建一个目录_empty 然后建立index.class.php
//空控制器
namespace Home\Controller\_empty;
user Think\Controller
class index extends Controller(){
public function run(){
echo '找不到' .CONTROLLER. ‘控制器的’ .ACTION_NAME. '方法';
}
}