摘要:整理下在ThinkPHP开发中发现的小问题及解决方案,整理在此。
一 . AJAX返回、跳转和重定向
场景重现:之前的代码逻辑是通过取得POST过来的数据,进行数据库操作后,通过ajaxRetrun()方法返回成功或失败标志。现在需要增加功能,在ajaxRetrun()方法后面再添加其他逻辑代码,发现这些代码都没有被执行。
跟踪后发现了问题是该方法最后使用exit()函数返回了需要ajax返回的数据,所以执行完该方法,脚本就退出了。
因此,还实验了跳转和重定向的问题,总结如下:
1.1 AJAX返回
在控制器中调用:
$this->ajaxReturn($data,'json');
该方法是Think\Controller命名空间下的一个方法,具体位置是:/ThinkPHP/Library/Think/Controller.class.php
查看该方法源码,可发现它是使用exit()函数返回json格式化以后的内容,并退出脚本。
所以控制器中ajaxReturn()函数后面的代码肯定是执行不了的。
1.2 跳转
在控制器中调用:
$this->success('测试跳转!','test',3);
该方法也是Think\Controller命名空间下的一个方法,并调用了Think\View命名空间下的display方法。
由于水平有限,该方法涉及到ThinkPHP模板引擎,故这里代码没有继续trace下去。
实际测试结果是跳转后的代码可以执行。
1.3 重定向
在控制器中调用:
$this->redirect('test');
该方法也是Think\Controller命名空间下的一个方法。
该方法中调用了公共函数库里的redirect()函数,公共函数库的具体位置是:/ThinkPHP/Common/functions.php
继续trace发现该函数最后也是调用exit()函数。
所以在重定向后面的代码也是执行不了的。
二 . 关于自定义模型类$this的使用
在PHP的语法-类定义-$this的解释是这样的:不管在对象的内部还是外部,访问对象的成员(属性或方法),都需要通过对象的引用变量,当对象被创建以后,在对象内部,则使用\$this这个对象引用。
在ThinkPHP的控制器中,我们使用:
$this->方法名();
这种方法。trace过程如下:
- 自定义的控制器都是继承Controller控制器的;
- 所以这样使用大部分都是在使用系统的Controller控制器里面的方法
而在ThinkPHP自定义模型类里面使用$this是这样的逻辑:
- 当我在自定义的模型类里面定义好几个关于数据表名称的属性;
- 比如tableName,tablePrefix,注意这些属性都要是protected类型的;
- 我们在使用D()方法实例化自定义模型类以后,就可以对该对象进行连贯操作、增删改查;
- 类似的可以在自定义模型类里面使用$this做连贯操作、增删改查;
ps.由于水平有限、TP理解深度不够,只能先这样理解,后续实时更新。
<完>