控制器
常见控制器就不去赘述了。
比如,UserController.class.php类。它是对外公开可访问的。我们可以成为访问控制器。那么很多时候,由于项目业务的 高度繁杂,我们可能希望把很多业务分离到另外的层结构,比如事件控制器层,那可以:
第一步、在HOME目录下创建事件控制器目录:Event;
第二部、创建UserEvent.class.php类;
//是否继承控制器基类或者其他基类,取决于业务需求
class UserEvent extends Controller{
public function test(){
echo '当触发测试事件,执行这个方法,该方法是内部调用的';
}
}
要访问这个方法也很简单
//访问方法
class UserController extends Controller{
public function test(){
$userEvent = new UserEvent(); //面向对象的访问方法
$userEvent->test(); //访问事件该控制器的test操作
echo 'test';
}
}
PS:这里调用别的控制器还可以使用快捷调用方法A()。
$userEvent = A('User','Event'); //前面参数是控制器名,后面参数是事件层次。
$userEvent = A('Admin/User','Event'); //增加模块
参数绑定
参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数,可以简化方法的定义甚至路由的解析。
默认已经启用 了。所以不用额外配置。
默认的参数绑定是按变量名来绑定的,直接通过URL传递参数。
//变量名为$id
class UserController extends Controller{
public function index($id){
echo 'id:'.$id;
}
}
URL:http://localhost/Home/User/index/id/5
PS:当URL没有传参(id/5)的时候回报错,当然可以为其设定一个默认值。
public function index($id=1)
跳转和重定向
TP在操作数据库时,需要跳转和重定向页面,ThinkPHP提供了一组方法解决该问题。
//成功和失败的跳转
class UserController extends Controller{
public function index(){
$flag = true;
if($flag){
//会跳转到http://localhost/Home/User/all
$this->success('新增成功!','http://localhost/Home/User/all');
}else{
//会跳转到本页上一页
$this->error('新增失败!');
}
}
}
PS:success()
方法和error()
方法,第一个参数是提示信息、第二个跳转的地址、第三个是跳转时间。默认情况下success()方法是1秒,error()方法3秒。
//设置5秒
$this->success('新增成功!','http://localhost/Home/User/all',5);
success()
方法和error()
方法,跳转的时候就对应了相应的模板,默认如下:
//默认错误跳转对应的模板文件
'TMP_ACTION_ERROR'=>THINK_PATH.'Tpl/dispath_jump.tpl',
//默认成功跳转对应的模板文件
'TMP_ACTION_SUCCESS'=>THINK_PATH.'Tpl/dispath_jump.tpl',
自定义成功和错误提示模板页面
//这里的Public是指View视图下面的Public文件夹下的模板(html或tpl)页面
'TMP_ACTION_ERROR'=>'Public/success',
'TMP_ACTION_SUCCESS'=>Public/error,
对于自定义的模板,TP提供了一组变量可供使用。
变量 | 含义 |
---|---|
$msgTitle | 操作标题 |
$message | 页面提示信息 |
$status | 操作状态,1表示成功,0表示失败 |
$waitSecond | 跳转等待时间,单位为秒 |
$jumpUrl | 跳转页面地址 |
PS:如果对于数据库操作,采用了Ajax方式,那么success()
和error()
会自动ajaxReturn()方法返回数据提供调用。
TP还单独提供了重定向方法redirect(
),参数和U()
方法一样,这个方法使用的是URL规则。
$this->redirect('User/test',array('id'=>5),5,'页面跳转中...');
如果只是想纯粹的URL跳转,不去使用URL规则,可以直接使用redirect()
函数。
redirect('http://www.baidu.com',5,'页面跳转至...');
输入变量
我们在获取系统变量或者用户提交的数据时,这些变量数据错综复杂,一不小心就容易引起安全隐患,所以,TP提供了轻松和安全获取变量的解决方案。
//常规获取变量方式
$id = $_GET['id'];
$name = $_POST['name'];
$value = $_SESSION['var'];
$name = $_COOKIE['name'];
$file = $_SERVER['PHP_SELF'];
在TP中,我们不建议使用传统方式获取,因为没有统一的安全机制,后期调整也会比较麻烦,所以TP提供了I()
方法进行变量的获取和过滤。
I()方法的格式:I(‘变量类型.变量’,[‘默认值’],[‘过滤方法’])
变量类型 | 含义 |
---|---|
get | 获取GET参数 |
post | 获取POST参数 |
param | 自动判断请求类型获取GET、POST或者PUT参数 |
request | 获取REQUEST参数 |
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'],对它进行MD5加密(默认无值);
echo I('get.id','','md5');
PS:其他几个系统变量均采用以上方式。
默认情况下,I()
方法的过滤是:htmlspecialcbars,过滤掉html。
请求类型
TP提供了一组常量用来判断请求是否为GET、POST等,通过判断请求处理不同的业务逻辑。
常量 | 含义 |
---|---|
IS_GET | 判断是否GET提交请求 |
IS_POST | 判断是否POST提交请求 |
IS_PUT | 判断是否PUT提交请求 |
IS_DELETE | 判断是否DELETE提交请求 |
IS_AJAX | 判断是否AJAX提交请求 |
如:
//判断是否GET请求
if(IS_GET){
echo'是GET请求';
}else{
echo'不是GET请求';
}
空操作
空操作是指系统在找不到请求的操作方法时,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
//如果没有相关方法则执行
public function _empty($name){
echo '找不到方法:'.$name;
}
空控制器
所谓空控制器,就是请求不到指定控制器时,调用一个专门的空控制器。
//如果没有相关控制器则执行(前提是先创建EmptyController.class.php)
class EmptyController extends Controller{
public function index(){
echo '找不到控制器:'.CONTROLLER_NAME.'控制器';
}
}
操作绑定到类
TP提供了把每个操作方法定位到一个类的功能,即把每个层次分得更加细腻。
//设置操作绑定到类
'ACTION_BIND_CLASS'=>true,
然后在controller目录下建立User目录,在User目录建立index.class.php,再建立test.class.php。
//index.class.php
namespace Home\Controller\User;
use Think\Controller;
class index extends Controller{
public function run(){
echo 'User模块下的index类';
}
}
//test.class.php
namespace Home\Controller\User;
use Think\Controller;
class test extends Controller{
public function run(){
echo 'User模块下的test类';
}
}