【原创】使用ThinkPHP5的一些小技巧
1、没有安装wamp环境时,TP项目还能运行起来进行调试吗?
router.php用于php自带webserver支持,可用于快速测试,动命令:php -S localhost:8888 router.php,最好是在public目录下进行启动,这样访问localhost:8888的时候,再会默认走的public目录下的index.php文件,但是此时,如果本地没有数据库的话,可就连接不上数据喽,当然,如果连接的是线上的数据库那就没事!
2、如果用助手函数redirect,记得要return哦
return redirect('User/login');
3、空控制器和空操作在强制使用路由的情况下是不生效的【可以使用Route::miss()代替】,如果是非强制的话,路由miss的优先级是优于空控制器或者空操作的!
'url_route_must' => false, // 是否强制使用路由,默认为false,true代表强制使用路由
4、多级控制器示例:非强制路由状态下,同时定义了路由,那么默认非路由访问的方式就会失效,除非注释掉定义的路由
Route::get('home/index', 'index/one.Home/index'); // 路由访问方式 http://user.tp5.com/index/home/index http://user.tp5.com/index/one.home/index // 这个是非路由访问方式,定义了上面之后,下面的这个就会报错
5、方法注入和属性注入的使用注意事项:
1)常用于控制器初始化位置,方便同一控制器其他方法调用
2)方法注入所对应的方法,应写于对应模块的公有方法里,或者整个项目的公有方法里,即common.php。
/*** 控制器初始化* {@inheritDoc}* @see \think\Controller::_initialize()*/public function _initialize(){Request::hook(‘user’,‘getUserInfo’); // 方法注入Request::instance()->bind(‘user’,new User); // 属性注入}/*** 控制器首页*/public function index(){var_dump($info = Request::instance()->user(1));var_dump($info = Request::instance()->user);}
5、操作方法参数绑定:
变量名绑定不一定由访问URL决定,路由地址也能起到相同的作用,但是当有定义路由的时候,参数优先遵循路由规则
http://serverName/index.php/index/blog/read/id/5 http://serverName/index.php/index/blog/archive/year/2016/month/06
6、用partition 方法来进行数据库水平分表:
不要使用任何 SQL 语句中会出现的关键字当表名、字段名,例如 order 等。会导致数据模型拼装 SQL 语句语法错误。
partition($data, $field, $rule);// $data 分表字段的数据// $field 分表字段的名称// $rule 分表规则// 用于写入$data = [‘id’ => 1,‘name’ => ‘think’];$rule = [‘type’ => ‘mod’, // 分表方式‘num’ => 3 // 分表数量,3张表];// 需要创建3张表,分别为log_1,log_2,log_3// cid所对应的值,会从0开始排,0进入log_1,1进入log_2,2进入log_3,3进入log_1一次循环Db::name(‘log’)->partition([‘cid’ =>0], “cid”, $rule)->insert($data);// 用于查询$list = Db::name(‘log’)->partition([‘cid’ =>0], “cid”, $rule)->where([‘id’ => 1])->select();var_dump($list);
7、判断数据集是否为空的方法:
不能直接使用empty
判断,而必须使用数据集对象的isEmpty
方法判断,例如:
$users = Db::name(‘user’)->select();if($users->isEmpty()){echo ‘数据集为空’;}
8、在模型内部获取单个数据的注意事项:
如果你是在模型内部,请不要使用$this->name的方式来获取数据,请使用$this->getAttr(‘name’) 替代
$user = User::get(1);echo $user->name;echo $user->getAttr(‘name’);
9、在volist标签循环输出中,mod的含义:
mod代表每次展示的个数,下面对应的value值,代表每次查询的起始位置,示例:
{volist name=”list” id=”user” key=”k” mod=”5″}<li>{$k}== {$key}</li>{eq name=”mod” value=”3″}<br/>{/eq}{/volist}
结果为【即5个一组,从键值为3的地方开始】:
1== 0 2== 1 3== 2 4== 3 5== 4 6== 5 7== 6 8== 7 9== 8 10== 9
10、异常捕获使用时的注意事项:
可以使用PHP的异常捕获进行必要的处理,但需要注意一点,在异常捕获中不要使用think\Controller
类的error、success和redirect方法,因为上述三个方法会抛出HttpResponseException
异常,从而影响正常的异常捕获,例如:
// 错误方式,这种方式会抛异常,显示执行错误try{$info = Db::name(‘user’)->find(1);$this->success(‘执行成功!’);}catch(\Exception $e){$this->error(‘执行错误’);}// 正确方式,这种方式是正确的,会显示执行成功try{$info = Db::name(‘user’)->find(1);}catch(\Exception $e){$this->error(‘执行错误’);}$this->success(‘执行成功!’);
11、SQL监听的注意事项:
监听方法需要写到执行语句之前,这样,才能监听到后面SQL语句执行的过程
Db::listen(function($sql, $time, $explain){// 记录SQLecho $sql. ‘ [‘.$time.‘s]’;// 查看性能分析结果dump($explain);});$list = Model\User::find(1)->toArray();
12、批量验证的使用方法:
批量验证如果验证不通过,返回的是一个错误信息的数组【非批量验证,需要把batch()去掉,这样报错之后,就会中断,返回的是字符串】。使用方法如下:
$rule = [‘name’ => ‘require|max:25’,‘age’ => ‘number|between:1,120’,’email’ => ’email’,];$msg = [‘name.require’ => ‘名称必须’,‘name.max’ => ‘名称最多不能超过25个字符’,‘age.number’ => ‘年龄必须是数字’,‘age.between’ => ‘年龄只能在1-120之间’,’email’ => ‘邮箱格式错误’,];$data = [‘name’ => ‘thinkphp’,‘age’ => 121,’email’ => ‘thin@kphp@qq.com’,];$validate = new Validate($rule, $msg);if(!$validate->batch()->check($data)){var_dump($validate->getError());}
返回结果如下:
array (size=2)‘age’ => string ‘年龄只能在1-120之间’ (length=26)’email’ => string ‘邮箱格式错误’ (length=18)
13、ajax提交数据的注意事项:
token参数的获取,以及URL参数的填写,示例如下:
<div>表单提交测试</div><div><form method=“post” action=“index/index/save”>{:token()}<input type=“text” name=“name” value=“Hello”><input type=“hidden” name=“_method” value=“PUT” ><input type=“submit” value=“提交”></form><div class=“js_submit” style=”width:100px;height:100px;border:1px solid red;”></div></div><script>$(function(){$(‘.js_submit’).click(function(){let token = $(‘:input[name=”__token__”]’).val();let params = {name:‘你好’,__token__:token};$.post(“index/index/save”, params, function(json){if(json.status == 1){alert(json.msg);}else{alert(json.msg);}},‘json’);});});</script>