thinkphp学习2-控制器
1.定义控制器
一般来说,ThinkPHP的控制器是一个类,而操作则是控制器类的一个公共方法。
控制器通常需要继承系统的Controller类或者其子类,例如,下面定义了一个 \Home\Controller\IndexController 控制器类:
<?php
namespace Home\Controller;
use Think\Controller; class IndexController extends Controller {
public function hello(){
echo 'hello';
}
public function test(){
echo 'test';
}
}
?>
控制器的名称采用驼峰法命名(首字母大写),操作方法的定义必须是公共方法,否则会报操作错误。
IndexController控制器类的hello和test方法就是操作方法,通过下面的URL地址访问控制器方法:
http://serverName/Home/Index/hello
http://serverName/Home/Index/test
2.实例化控制器
访问控制器的实例化通常是自动完成的,系统会根据URL地址解析出访问的控制器名称自动实例化,并且调用相关的操作方法。
如果你需要跨控制器调用的话,则可以单独实例化:
// 实例化Home模块的User控制器
$user = new \Home\Controller\UserController();
系统为上面的控制器实例化提供了一个快捷调用方法A,上面的代码可以简化为:
// 假设当前模块是Home模块
$user = A('User');
$blog = A('Admin/Blog');
3.前置和后置操作
前置和后置操作指的是在执行某个操作方法之前和之后会自动调用的方法,不过仅对访问控制器有效。
前置和后置操作的定义方式如下:
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller{
//前置操作方法
public function _before_index(){
echo 'before<br/>';
}
public function index(){
echo 'index<br/>';
}
//后置操作方法
public function _after_index(){
echo 'after<br/>';
}
}
如果我们访问 http://serverName/index.php/Home/Index/index 结果会输出
before
index
after
4.Action参数绑定
参数绑定功能默认是开启的,其原理是把URL中的参数(不包括模块、控制器和操作名)和操作方法中的参数进行绑定。
要启用参数绑定功能,首先确保你开启了URL_PARAMS_BIND设置:
'URL_PARAMS_BIND' => true, // URL变量绑定到操作方法作为参数
默认的参数绑定方式是按照变量名进行绑定,例如:
namespace Home\Controller;
use Think\Controller;
class BlogController extends Controller{
public function read($id){
echo 'id='.$id;
} public function archive($year='2013',$month='01'){
echo 'year='.$year.'&month='.$month;
}
}
当访问URL地址:
http://serverName/index.php/Home/Blog/read/id/5
http://serverName/index.php/Home/Blog/archive/year/2013/month/11
两个URL地址中的id参数和year和month参数会自动和read操作方法以及archive操作方法的同名参数绑定。
按照变量名进行参数绑定的参数必须和URL中传入的变量名称一致,但是参数顺序不需要一致。
如果使用下面的URL地址进行访问,参数绑定仍然有效:
http://serverName/index.php?c=Blog&a=read&id=5
http://serverName/index.php?c=Blog&a=archive&year=2013&month=11
如果用户访问的URL地址是:
http://serverName/index.php/Home/Blog/read/
那么会抛出下面的异常提示: 参数错误:id
报错的原因很简单,因为在执行read操作方法的时候,id参数是必须传入参数的,但是方法无法从URL地址中获取正确的id参数信息。由于我们不能相信用户的任何输入,因此建议你给read方法的id参数添加默认值,例如:
public function read($id=0){
echo 'id='.$id;
}
始终给操作方法的参数定义默认值是一个避免报错的好办法。
第二种方式是按照变量的顺序绑定,这种情况下URL地址中的参数顺序非常重要,不能随意调整。要按照变量顺序进行绑定,必须先设置URL_PARAMS_BIND_TYPE为1:
'URL_PARAMS_BIND_TYPE' => 1, // 设置参数绑定按照变量顺序绑定
操作方法的定义不需要改变,URL的访问地址分别改成:
http://serverName/index.php/Home/Blog/read/5
http://serverName/index.php/Home/Blog/archive/2013/11
5.AJAX返回
系统的\Think\Controller类提供了ajaxReturn方法用于AJAX调用后返回数据给客户端。并且支持JSON、JSONP、XML和EVAL四种方式给客户端接受数据,并且支持配置其他方式的数据格式返回。如果是EVAL方式的话,只会输出字符串data数据。
ajaxReturn方法调用示例:
$data['status'] = 1;
$data['content'] = 'content';
$this->ajaxReturn($data);
默认配置采用JSON格式返回数据(通过配置DEFAULT_AJAX_RETURN进行设置),我们可以指定格式返回,例如:
// 指定XML格式返回数据
$data['status'] = 1;
$data['content'] = 'content';
$this->ajaxReturn($data,'xml');
默认的JSONP格式返回的处理方法是jsonpReturn,如果你采用不同的方法,可以设置:
'DEFAULT_JSONP_HANDLER' => 'myJsonpReturn', // 默认JSONP格式返回的处理方法
或者直接在页面中用callback参数来指定。
如下:http://localhost:81/myapp/home/index/test?callback=jsCallback
输出为:
jsCallback({"name":"\u5468\u5bcc\u6c11","age":26});
6.跳转和重定向
系统的\Think\Controller类内置了两个跳转方法success和error,用于页面跳转提示,而且可以支持ajax提交。
success和error方法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间(单位为秒),例如:
// 操作完成3秒后跳转到 /Article/index
$this->success('操作完成',U('/Article/index'),3);
// 操作失败5秒后跳转到 /Article/error
$this->error('操作失败',U('/Article/error'),5);
跳转地址是可选的,success方法的默认跳转地址是$_SERVER["HTTP_REFERER"],error方法的默认跳转地址是javascript:history.back(-1);。
默认的等待时间success方法是1秒,error方法是3秒
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函数的用法一致,例如:
//重定向到New控制器的Category操作
$this->redirect('New/category', array('cate_id' => 2), 5, '页面跳转中...');
7.URL生成
ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响。
U方法的定义规则如下(方括号内参数根据实际应用决定):
U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])
地址表达式的格式定义如下:
[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...
如果不定义模块的话 就表示当前模块名称,下面是一些简单的例子:
U('User/add'); // 生成User控制器的add操作的URL地址
U('Blog/read?id=1'); // 生成Blog控制器的read操作 并且id为1的URL地址
U('Admin/User/select'); // 生成Admin模块的User控制器的select操作的URL地址
U方法的第二个参数支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,例如:
U('Blog/cate',array('cate_id'=>1,'status'=>1));
U('Blog/cate','cate_id=1&status=1');
U('Blog/cate?cate_id=1&status=1');
注意:如果你是在模板文件中直接使用U方法的话,需要采用 {:U('参数1', '参数2'…)} 的方式。
thinkphp学习2-控制器的更多相关文章
- ThinkPHP学习(二)理清ThinkPHP的目录结构及访问规则,创建第一个控制器
ThinkPHP的目录结构 回顾上一篇的安装目录: 目录对应关系 F:\\PHP├─index.php 入口文件├─README.md README文件├─Applicatio ...
- ThinkPHP学习总结
ThinkPHP学习总结 网站开发使用的thinkPHP5.0在此总结备查 MVC关系功能图 一.Thinkphp开发规范 l 类 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并 ...
- ThinkPhp学习01
原文:ThinkPhp学习01 一.ThinkPHP的介绍 MVC M - Model 模型 工作:负责数据的操作 V - View 视图(模板 ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- thinkphp学习笔记7—多层MVC
原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...
- thinkphp学习笔记6—url模式
原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...
- thinkphp学习笔记5—模块化设计
原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...
- thinkphp学习笔记4—眼花缭乱的配置
原文:thinkphp学习笔记4-眼花缭乱的配置 1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展 ...
- ASP.NET MVC学习之控制器篇(二)
原文链接:http://www.asp.net/learn/mvc/ 这篇教程探索了ASP.NET MVC控制器(controller).控制器动作(controller action)和动作结果(a ...
- ThinkPhp学习13
原文:ThinkPhp学习13 简单登录验证 创建Login类 <?php class LoginAction extends Action { function index(){ $this- ...
随机推荐
- C语言学习记录_2019.02.05
switch只能判断整数,而分段函数的判别是一个范围,我们无法用整数来表示范围 跟踪语句的方法: (1)debug调试 (2)printf( )语句跟踪 小套路:当循环次数很大时,可以先模拟较小次数的 ...
- 《Java 程序设计》课堂实践项目-类定义
<Java 程序设计>课堂实践项目类定义 课后学习总结 目录 改变 类定义实验要求 课堂实践成果 课后思考 改变 修改了博客整体布局,过去就贴个代码贴个图很草率,这次布局和内容都有修改. ...
- 创建表空间时ora-01119和ora-27040的处理
创建时出错: SQL> create tablespace gaotbs logging datafile '/u01/app/datafiles/gaodata1.dbf' ...
- Cenos6.6 升级 python3.5.2 安装配置 django1.10
1 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件) yum groupinstall 'Development Tools' yum install zl ...
- python基础学习1-列表推导式和字典推导式
#!/usr/bin/env python # -*- coding:utf-8 -*- #列表推导式 取得100内可以被2整除且不能被3整除的数字 a=[i for i in range(100) ...
- Spring的IOC理解(转载)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- cogs1685 【NOI2014】魔法森林 Link-Cut Tree
LCT练手好题啊. SPFA的做♂FA是把边按照a排序,然后加一条权值为b的边跑SPFA,不断更新答案.很好的做♂FA,但复杂度无♂FA保证. LCT的做♂FA类似,也是把边按照a排序,然后也是加一条 ...
- [BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]
题意 题目链接 分析 分数规划之后可以得到式子:\(max-min-r*mid+l*mid\geq k*mid\) . 贪心选择,肯定区间的端点是极小或者极大值.特殊处理区间长度 \(\leq L\) ...
- Python之元类详细解析
一.补充内置函数isinstance和issubclass 1.isinstance是判断一个对象是不是由一个对象产生的 class Foo: pass obj=Foo() print(isinsta ...
- 初识IT行业,人生苦短,我学python
第一次写,我也不知道该怎么写.只有慢慢的去体会大神们的见解与看法. Python是一个较强的脚本语言,而Java是强类型的编程语言.为了更好的入门,我没有去选择强类型语言的Java,而选择使用Pyth ...