禁止使用系统保留函数:
display get show fetch theme assign error success
如果你使用了,我会杀了你!
设置操作函数的后缀:
'ACTION_SUFFIX' => 'Action' // 操作方法后缀
1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 class IndexController extends Controller 5 { 6 public function listAction(){ 7 echo 'list'; 8 } 9 10 public function helloAction(){ 11 echo 'hello'; 12 } 13 14 public function testAction(){ 15 echo 'test'; 16 } 17 }
多层控制器:
在介绍Think PHP 架构的时候,我已经简单的介绍过多层控制器的概念,即可以把控制层细化为控制部分和事件处理部分。这里需要更详细的指明的一点是,控制部分一般需要继承Controler类,但是事件处理部分一般不是访问的入口(输出到模板),所以经常不需要继承Controler类。举例:
事件控制器代码举例:
1 <?php 2 namespace Home\Event; 3 class UserEvent { 4 public function login(){ 5 echo 'login event'; 6 } 7 public function logout(){ 8 echo 'logout event'; 9 } 10 } 11 ?>
多级控制器:
'CONTROLLER_LEVEL' => 2
调用规则及A函数:
1 $User = new \Home\Controller\UserController(); 2 //实例化Admin模块的Blog控制器 3 $Blog = new \Admin\Controller\BlogController(); 4 系统为上面的控制器实例化提供了一个快捷调用方法A,上面的代码可以简化为 5 //假设当前模块是Home模块 6 $User = A('User'); 7 $Blog = A('Admin/Blog'); 8 //假设当前模块是Home模块 9 //实例化Event控制器 10 $User = A('User','Event'); 11 $Blog = A('Admin/Blog','Event');
Controler前置方法和后置方法:
1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 class IndexController extends Controller{ 5 //前置操作方法 6 public function _before_index(){ 7 echo 'before<br/>'; 8 } 9 public function index(){ 10 echo 'index<br/>'; 11 } 12 //后置操作方法 13 public function _after_index(){ 14 echo 'after<br/>'; 15 } 16 } 17 ?>
注意事项如下:
1. 如果当前的操作并没有定义操作方法,而是直接渲染模板文件,那么如果定义了前置和后置方法的话,依然会生效。真正有模板输出的可能仅仅是当前的操作,前置和后置操作一般情况是没有任何输出的。
2. 需要注意的是,在有些方法里面使用了exit或者错误输出之类的话 有可能不会再执行后置方法了。例如,如果在当前操作里面调用了控制器类的error方法,那么将不会再执行后置操作,但是不影响success方法的后置方法执行。
再议URL参数绑定:
之前已经介绍过URL的参数绑定方案,就是通过方法/参数A/A值/参数B/B值……的方法。
实际上URL参数绑定还有另外一种方案,就是只传值不写参数名。
但是这样绑定需要在配置文件中配置如下配置项:
'URL_PARAMS_BIND_TYPE' => 1
只有在该配置项为1的时候,函数才会顺序从URL中读入参数值。
变量顺序绑定的方式目前仅对PATHINFO地址有效。
如果不想使用参数绑定,可以设置如下内容:
'URL_PARAMS_BIND' => false
URL伪静态:
URL伪静态可以更好的支持SEO。
举例设置:'URL_HTML_SUFFIX'=>'html'
这样,原来的访问链接:
http://123.56.183.226/index.php/Home/search/detail/3329061
可以修改为:
http://123.56.183.226/index.php/Home/search/detail/3329061.html
如果把伪静态URL_HTML_SUFFIX设置为空值,那么框架将支持所有的伪静态后缀。
支持多种伪静态,之间用|分割:'URL_HTML_SUFFIX'=>'html|pdf'
同样的,你可以通过另外一个参数设置禁用的伪静态后缀:
'URL_DENY_SUFFIX' =>'html'
这种情况下访问http://123.56.183.226/index.php/Home/search/detail/3329061.html会出错。
URL_DENY_SUFFIX 的优先级比 URL_HTML_SUFFIX 要高。
URL不区分大小写:
'URL_CASE_INSENSITIVE' =>true
这样是为了兼容Think PHP编程规范和Linux环境(区分大小写)。
URL生成之U函数的使用:
U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])
地址表达式:[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...
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('Blog/cate/cate_id/1/status/1')
带伪静态后缀:U('Blog/cate','cate_id=1&status=1','xml')
U函数会自动识别当前的URL模式生成特定的URL,包括普通模式、PATHINFO模式等。
U函数支持路由规则。
U函数同时支持域名和锚点,对应操作参考上面的表达式。
Ajax支持:
\Think\Controller 类里面包含了良好的ajax支持函数,你可以使用ajaxReturn 函数进行前后端交互:
$data['status'] = 1;
$data['content'] = 'content';
$this->ajaxReturn($data);
同时,你可以设置Ajax的数据返回格式:
$data['status'] = 1;
$data['content'] = 'content';
$this->ajaxReturn($data,'xml');
上面这种方法ajax返回的数据是xml格式。
默认的数据返回格式也是可以通过配置文件设置的:
页面跳转:
之前我们介绍了很多种的页面跳转方案,包括在配置文件中跳转和在异常处理页面中跳转,现在我们介绍一种新的页面跳转。那就是通过success函数和error函数。
1 $User = M('User'); //实例化User对象 2 $result = $User->add($data); 3 if($result){ 4 //设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER'] 5 $this->success('新增成功', '/User/index'); 6 } else { 7 //错误页面的默认跳转页面是返回前一页,通常不需要设置 8 $this->error('新增失败'); 9 } 10 11 //操作完成3秒后跳转到 /Article/index 12 $this->success('操作完成','/Article/index',3); 13 //操作失败5秒后跳转到 /Article/error 14 $this->error('操作失败','/Article/error',5);
success和error方法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间。
应该在配置文件中设置默认的success跳转模板和error跳转模板:
//默认错误跳转对应的模板文件
'TMPL_ACTION_ERROR' => THINK_PATH . 'Tpl/dispatch_jump.tpl',
//默认成功跳转对应的模板文件
'TMPL_ACTION_SUCCESS' => THINK_PATH . 'Tpl/dispatch_jump.tpl'
页面重定向:
//重定向到New模块的Category操作,重定向到New模块Category操作,数组传参数,在当前页面停留五秒钟
$this->redirect('New/category', array('cate_id' => 2), 5, '页面跳转中...')
当然也可以直接重定向到某个URL,这个时候无需调用控制器的方法,只需要调用一个函数:
redirect('/New/category/cate_id/2', 5, '页面跳转中...')
变量获取:
get 获取GET参数
post 获取POST参数
param 自动判断请求类型获取GET、POST或者PUT参数
request 获取REQUEST 参数
put 获取PUT 参数
session 获取 $_SESSION 参数
cookie 获取 $_COOKIE 参数
server 获取 $_SERVER 参数
globals 获取 $GLOBALS参数
path 获取 PATHINFO模式的URL参数
data 获取其他类型的参数,需要配合额外数据源参数
这些参数,我们可以通过正常的php函数获取,不过,Think PHP提供了强大的I函数,可以通用地获取上面的各种变量:
echo I('get.name'); // 相当于 $_GET['name']
echo I('get.name','hello'); // 在不存在$_GET['name']的时候返回hello
I('get.'); //获取所有的GET变量,注意get后面有个点。
echo I('get.name','','htmlspecialchars'); //采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
在PATHINFO模式下,可以按如下方法获取变量:
http://serverName/index.php/New/2013/06/01
echo I('path.1'); // 输出2013
echo I('path.2'); // 输出06
echo I('path.3'); // 输出01
data类型变量可以用于获取不支持的变量类型的读取。
上面所谓的变量过滤,实际上是可以在配置文件中配置的。所以在获取变量的时候,如果不指定过滤规则,会使用默认的变量过滤方案。
过滤规则可以设置为多个:
'DEFAULT_FILTER' => 'strip_tags,htmlspecialchars'
I('get.name')等价于:htmlspecialchars(strip_tags($_GET['name']))
当然,即使设置了DEFAULT_FILTER,我们也可以在I函数中指定过滤规则,这个时候就会忽略掉配置文件。实际上,这相当于介绍架构的时候我讲过的,动态配置
I函数的第三个变量也可以调入函数名,这样就会使用对应的函数进行过滤。也可以使用正则表达式过滤。同时,还支持其他一些过滤规则。(email等)
下面这两种方法,代表不使用过滤规则,包括配置文件中的:
I('get.name','','');
I('get.id','',false);
I函数还支持参数类型转换:
举例:
I('get.id/d'); // 强制变量转换为整型
请求类型:
系统内置的请求类型:
使用方法举例:
1 <?php 2 class UserController extends Controller 3 { 4 public function update(){ 5 if(IS_POST){ 6 $User = M('User'); 7 $User->create(); 8 $User->save(); 9 $this->success('保存完成'); } 10 else{ 11 $this->error('非法请求'); 12 } 13 } 14 } 15 ?>
空操作:
前面介绍过前置函数和后置函数,现在介绍下空操作函数,举例:
1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 class CityController extends Controller{ 5 public function _empty($name){ 6 //把所有城市的操作解析到city方法 7 $this->city($name); 8 } //注意 city方法 本身是 protected 方法 9 protected function city($name){ 10 //和$name这个城市相关的处理 11 echo '当前城市' . $name; 12 } 13 } 14 ?>
URL:http://serverName/index.php/Home/City/beijing/ 输出:当前城市beijing
空控制器:
和空操作类似,这里只给出示例代码:
1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 class EmptyController extends Controller{ 5 public function index(){ 6 //根据当前控制器名来判断要执行那个城市的操作 7 $cityName = CONTROLLER_NAME; 8 $this->city($cityName); 9 }//注意 city方法 本身是 protected 方法 10 protected function city($name){ 11 //和$name这个城市相关的处理 12 echo '当前城市' . $name; 13 } 14 } 15 ?>
http://serverName/index.php/Home/beijing/ 由于系统中没有beijing这个控制器,所以会掉入空控制器。
插件控制器:
插件控制器是另外一种不按照前面URL规则调用控制器的URL规则,需要配置文件中VAR_ADDON 参数的配合,个人认为,对于工程而言并非必须,反而容易使项目丧失整洁性。
操作绑定到类:
实现该功能需要配置:'ACTION_BIND_CLASS' => True
http://serverName/Home/Index/index
index.class.php示例如下:
1 <?php 2 namespace Home\Controller\Index; 3 use Think\Controller; 4 class index extends Controller{ 5 public function run(){ 6 echo '执行Index控制器的index操作'; 7 } 8 } 9 ?>
在操作绑定到类中,我们也可以只用前面介绍过的前置函数、后置函数、空操作和空控制器。只需要把前面的规则对应改为操作绑定到类的规则。
来源:https://www.cnblogs.com/toocooltohavefriends/p/5223767.html