### 1.钩子的使用
与controller 文件同级创建 behavior文件夹,创建类(此类不需要集成任何类),run()方法,将权限或者日志逻辑放在钩子里。
```
namespace app\admin\behavior;
/*权限钩子*/
public function run($params)
{
$aid=$params['id'];
if($aid==1){
$per=(new PermissionModel())->field(['id','name','url','pid','type'])->select()->toArray();//获取所有权限
}else{
$adminmodel=new AdminModel();
$role_ids=$adminmodel->where('id',$aid)->value('role_id');
$role_names=(new RoleModel())->where('id','in',$role_ids)->select();
$arr=[];
foreach($role_names as $k=>$v){
$perid=explode(',',$v['perid']);
foreach($perid as $k1=>$v1){
array_push($arr,$v1);
}
}
$arr=array_unique($arr);
$per=(new PermissionModel())->field(['id','name','url','pid','type'])->where('id','in',$arr)->select()->toArray();//获取所属权限
}
$arrs['url']='index/index';
$arrs['id']='9999';
$arrs['pid']='9999';
$arrs['name']='首页';
$arrs['type']=0;
array_push($per,$arrs);
session('routes',$per);
}
```
### 2. 控制器中或者模型中都可以调用钩子(此处是在登录模型中调用)
~~~
use think\facade\Hook; //引入钩子
session('aid',$info['id']);
session('aname',$info['username']);
$param['id']=$info['id'];
//方法一:
Hook::exec('app\admin\behavior\Rbac',$param); //直接执行钩子
//方法二:
Hook::add('app_init','app\admin\behavior\Rbac');//绑定钩子
Hook::listen('app_init',$param);//监听钩子
~~~
### 3.使用场景: 权限菜单、日志文件
### 4.验证码刷新
```
~~~
//视图
<div class="row cl">
<div class="formControls col-xs-8 col-xs-offset-3">
<input class="input-text size-L" name="code" type="text" placeholder="验证码" style="width:150px;">
<img class= 'reloadverify' src="{:url('login/verify')}">
</div>
</div>
//js
$(function() {
var verifyimg = $(".reloadverify").attr("src");
$(".reloadverify").click(function() {
if (verifyimg.indexOf('?') > 0) {
$(".reloadverify").attr("src", verifyimg + '&random=' + Math.random());
} else {
$(".reloadverify").attr("src", verifyimg.replace(/\?.*$/, '') + '?' + Math.random());
}
});
});
//控制器
~~~
/**
* 验证码方法
*/
use think\captcha\Captcha;
public function verify(){
$config = [
'fontSize' => 30,// 验证码字体大小
'length' => 2, // 验证码位数
'useNoise' => false, // 关闭验证码杂点
'useCurve'=>false //关闭杂线
];
$captcha = new Captcha($config);
return $captcha->entry();
}
~~~
```
### 5.公用方法
~~~
/*
* @params $str
* @params $arr
* @return bool
* 判断字符串是否在数组中,包括二维数组及多维数组*/
public function array_multi_search($str,$arr){
if(in_array($str,$arr)){
return true;
}
foreach($arr as $k=>$v){
if($this->array_multi_search($str,$v)){
return true;
}
}
return false;
}
/*
* @params $list
* @params $pk
* @params $pid
* @params $root
* @return array
* 将数组转为树
* */
public function list_to_tree($list, $pk = 'id', $pid = 'pid', $root = 0){
$tree = array();
if (is_array($list)) {
$refer = array();
foreach ($list as $key => $data) {
$refer[ $data[ $pk ] ] = &$list[ $key ];
}
foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = $data[ $pid ];
if ($root == $parentId) {
$tree[ $data[ $pk ] ] = &$list[ $key ];
} else {
if (isset($refer[$parentId])) {
$parent = &$refer[ $parentId ];
$parent['child'][] = &$list[ $key ];
}
}
}
}
return $tree;
}
~~~
### 6.上传图片(单文件)
~~~
/**
* 上传文件
*/
use think\Request;
public function upload()
{
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('file');
// 移动到框架应用根目录/uploads/ 目录下
$info = $file->move( '../public/uploads');
if($info){
$path='/uploads/'.$info->getSaveName();
return ['code'=>1,'msg'=>'上传成功!','url'=>$path];
}else{
return ['code'=>0,'msg'=>$file->getError()];
}
}
~~~
### 7.tp5.1创建控制器、模型、验证器
php think make:controller admin/Index
php think make:model admin/IndexModel
php think make:validate admin/IndexValidate
### 8.tp5.1 简单配置
app.php
~~~
// 应用调试模式
'app_debug' => true,
// 应用Trace
'app_trace' => true,
// 默认AJAX 数据返回格式,可选json xml ...
'default_ajax_return' => 'json',
~~~
database.php
~~~
// 自动写入时间戳字段
'auto_timestamp' => true,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
~~~
~~~