TP5常用方法
常用:
创建资源控制器:php think make:controller backend/Admin
资源路由:Route::resource('backend/admin','backend/Admin');
各种包或者方法函数的调用:
1、common.php里的函数:downloadExcel($strTable,'order');
2、同一个控制器下的方法:$this->downloadExcel($strTable,'order');
3、使用Controller\Common.php里的方法,继承Common,可以直接使用里面的方法。也就是说,继承了Common之后,Common.php里面的方法都在继承的控制器里面了。
4、使用composer安装后的包:use \PHPExcel; 然后new PHPExcel();
【或者】 new \PHPExcel();
//后面这个在phpexcel的时候有问题,因为PHPExcel还要使用到use \PHPExcel_IOFactory;
5、使用第三方文件放在extend的方法类似,但是要注意use是否引入的足够。
extend目录下创建目录xyzf,里面有Utils类,该类下有toXml方法:
方法一:
第1步:$Utils = new \xyzf\Utils(); //或者use xyzf\Utils,然后$Utils = new Utils();
第2步:$Utils->toXmls();
方法二:
或者不需要use,直接:\命名空间\类::方法名();
特别注意:命名空间必须和文件夹同名,比如 namespace xyzf;
读取配置文件中的配置(助手函数):$mchId = config('wx_app.mchId');每个模块会默认加载自己的配置文件。
cache:
设置cache:Cache::set('user_info', $res);//user_info是个数组或字符串
清除cache:Cache::clear();
cache助手函数:
// 设置缓存数据
cache('name', $value, 3600);
// 获取缓存数据
var_dump(cache('name'));
// 删除缓存数据
cache('name', NULL);
// 设置缓存的同时并且进行参数设置
cache('test', $value, $options);
request的使用,数据传输的使用:
if (request()->isPost()){
$request = request();
//dump($request->ip());
dump($request->post());
}
//获取数组变量
input('post.photo_list/a') ————这里的/a表示接收到的是一个数组变量
使用助手函数获取post变量:
input('admin_id'); //获取admin_id
input('post.admin_id'); //获取post方式下的admin_id
input('post.'); //获取所有post数据
request()->only(['id','name']); //获取id和name变量的值。
request()->except('id,name'); //获取排除id和name的变量
// 指定json数据输出/向前端返回JSON格式的数据
return json(['data'=>$data,'code'=>1,'message'=>'操作完成']);
JSON转码:
json_encode :对对象进行json编码 (obj -> string)
json_decode:对json字符串进行解码(string -> obj/arr)
备注:json_decode($res,true) //加参数true,返回数组,而不是object。
控制器含function _initialize(){}或者function __construct(){}方法,在执行该控制器下的任何方法时,都会先执行。
跳转和重定向:(可以改默认跳转的模板文件指向,或直接修改)
$this->success('新增成功', 'User/list');
$this->error('新增失败'); //javascript:history.back(-1);
$this->redirect('News/category', ['cate_id' => 2]);
视图渲染+模板赋值:
return $this->fetch(' ',['title' => '缴交费用','user' => $users,]);
模板赋值:$this->assign('user',$users);
批量赋值:$this->assign(['user' => $user,'age' => '26']);
前端的使用:$user.admin_id,
或者user为数组时候:
{volist name="user" id="vo" empty="暂时没有数据"}
<tr>
<td>{$vo.admin_id}</td>
<td>{$vo.admin_username}</td>
<td>{$vo.admin_password}</td>
<td><a title="">删除</a></td>
</tr>
{/volist}
在模板中使用URL:
方法一:"{:url('index/pay/pay',['id'=>5,'name'=>'thinkphp'])}"
含JS参数的时候:
方法二:"/admin/export/exportOrder/time_start/" + timeStart + '/time_end/' + timeEnd;
方法三:"{:url('admin/export/exportOrder')}?time_start=" + timeStart + '&time_end=' + timeEnd;
——注意:有JS参数的时候,不要老想着把JS参数放在php的参数数组里。
获取当前界面的URL:
方法一:$url = request()->domain().'/'.request()->pathinfo();
方法二:$url = request()->domain().request()->url();
session:
在模板中使用session:{:session('admin.admin_username')}
赋值(当前作用域)session('name', 'thinkphp');
赋值think作用域 session('name', 'thinkphp', 'think');
判断(当前作用域)是否赋值 session('?name');
取值(当前作用域)session('name');
取值think作用域 session('name', '', 'think');
删除(当前作用域)session('name', null);
清除session(当前作用域)session(null);
清除think作用域 session(null, 'think');
cookie:
设置 cookie('name', 'value', 3600); //key,velue,有效时间
获取 echo cookie('name');
删除 cookie('name', null);
清除 cookie(null, 'think_');
数据库:
查:$data = db('admin')->where('admin_id',2)->find(); //一条数据
$data = db('admin')->where('openid',session('openid'))->select(); //一条数据
db('admin')->field('admin_id,title,content')->select(); //指定查询返回的数据
增:db('admin')->insert($data); //$data为定义好的,key与数据库key一致的数组。
db('admin')->insertGetId($data); //插入后返回自增主键
db('admin')->insertAll($data) //插入多条数据
改:db('user')->where('id',1)->update(['name' => 'thinkphp']); //改数据
db('user')->where('id',1)->setField('name','thinkphp'); //改字段
删:db('user')->where('id',1)->delete();
链式操作:db('user')->where('id',1)->where('create_time','> time','2016-1-1')->order('create_time')->limit(10)->select();
取出某字段值
db('user')->where(['is_member'=>'是'])->column("openid"); //取出所有党员的openid
多表联合查询:(a左表,b右表)
$activitys = db('activity')
->alias('a')
->join('activity_enroll b','a.activity_id = b.activity_id')
->where(['openid'=>session('openid')])
->select();
时间区间查询:
where('time_end','between',[input('time_start'),input('time_end')])
重复数据查询:
select tax_num,count(*) as count from `order` group by tax_num having count>1;
排除某字段查询:
$res = request()->except('photo_list');
获取最后一条SQL:
echo db('activity')->getLastSql(); //模型层里的方法使用:$this->getLastSql();
模糊查询
where('order_id', 'like', '%'.input('order_id').'%')
查询某一字段:
Db::table('think_user')->field('id,title,content')->select();
多字段同一条件的查询:
where('name|title','like','%thinkphp');
同字段多条件查询:
$trainList = db('train')->where('category','in',input('get.categoryArr'))->select();
任意多条件查询:whereOr
$essayList = db('party_construct')
->where(['category'=>'党务资讯'])
->whereOr(['category'=>'党章知识'])
->select();
统计条数:
$count = db('order')->count('company');
获取最大值:
Db::table('think_user')->max('score');
获取平均值:
db('user')->avg('score');
获取总和:
db('user')->sum('score');
时间和时间戳:
当前时间戳:time();
时间戳转日期:date('Y-m-d H:i:s', $val['time_end']);//$val['time_end']为时间戳转换。
日期转时间戳:strtotime('2010-03-24 08:15:42');
时间格式:date('y-m-d h:i:s',time()),mysql存储数据的时候,选择datetime,length无需设置
对模板输出变量使用函数:
{$name|md5|strtoupper|substr=0,3}
{$repairList.description|mb_substr=0,10,'utf-8'}
{$create_time|date="Y-m-d H:i:s",###} //调用date函数,第二个参数就是$create_time,用###代替
{$user.nickname|default="这家伙很懒,什么也没留下"}
模板标签的条件判断:
{if condition="($name == 1) OR ($name > 100) "} value1
{elseif condition="$name eq 2"/} value2
{else /} value3
{/if}
halt():变量调试输出并中断执行。
日志的使用:
use think\facade\Log;
$payResXml = file_get_contents('php://input');
$payRes = xml_to_array($payResXml);
Log::record('返回的数据是==>' . json_encode($payRes));
(请注意,数组是不行的,先用json_decode转换成字符串。)
查看最后的日志:切换到服务器该项目下,然后执行tailf runtime/log/201710/11.log
ob_clean():丢弃输出缓冲区的内容。
获取数组长度:count($arr)或者sizeof($arr)
验证码前端的两种方法:
<img id="img" src="{:captcha_src()}" onclick="this.src = 'http://haitian.windyet.com/captcha.html?' + Math.random()"/>
<img id="img" src="{:captcha_src()}" onclick="this.src = this.src+ '?' + Math.random()"/>
使用require的话,直接在方法里面require。如:
public function ssssssssssssssss($src, $delold = true)
{
require VENDOR_PATH.'qiniu/php-sdk/autoload.php'
}
上传文件并移动和重命名:
<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image" /> <br>
<input type="submit" value="上传" />
</form>
public function upload(){
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到框架应用根目录/public/uploads/ 目录下
if($file){
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension();
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
}
action()调用其他控制器里面的方法:
$res = action('admin/test/test2',[100,300]);
public function test2($a,$b){ } //假设这个admin/test/下的方法。
——请注意,这个方法只能调用方法,却不能return回数据。要返回数据,可放在common.php或者同控制器下,直接采用$this->方法名即可。
验证器的设置(以admin/Admin为例):
<?php
namespace app\admin\validate;
use think\Validate;
class Admin extends Validate
{
/**
* 部分场景下的使用:
*/
protected $rule = [
/*以下注释是因为前端做了处理,不然总是因为未输入而跳转,麻烦。*/
['admin_username', 'require', '请输入用户名'],
['admin_password', 'require', '请输入密码'],
['captcha', 'require|captcha', '请输入验证码|验证码不正确'],
['status', 'number|in:-1,0,1', '状态必须为数字|状态范围不合法'],
['list_order', 'number|max:10', '订单编号必须为数字|订单编号不超过10个字符'],
];
/**
* 不同场景下的使用:
*/
protected $scene = [
'login' => ['admin_username', 'admin_password', 'captcha'],
'list_order' => ['captcha', 'status', 'list_order'],
];
}
模型层/控制层使用验证器:
use think\Validate;
use think\Model;
$validate = validate('Admin');
$validate->check(input('post.')); //input('post.')的字段全部验证
$validate->scene(login)->check(input('post.')); //只验证login场景下设置的字段
//获取验证器的错误信息
$validate->getError();
直接使用验证器:
$rule = [
['new_password', 'require', '请输入新密码'],
['confirm_password', 'require|confirm:new_password', '请输入新密码|两次密码不一致'],
];
$validate = new Validate($rule);
if (!$validate->check($data)) {
return $validate->getError();
//dump($validate->getError());
}
验证码:
captcha_check(input('captcha'))
控制器层调用模型层的方法:
方法一:
use app\common\model\Admin;
(new Admin())->login(input('post.')); //请注意,类没有参数,方法才有参数(函数)
方法二:
model('Admin')->login(input('post.')); //请注意,类没有参数,方法才有参数(函数)
TP5中的模型层:
默认自动识别主键id,并且类名和数据表名一致。可以自己指定设置:
protected $pk = 'admin_id'; //主键
protected $table = 'blog_admin'; //请注意,必须得写完整的表名
模型层的增删改查:
备注:模型层中可以使用查询构造器,也可以使用模型层的方法。控制器中只能使用查询构造器。
1、添加一条数据:
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]
$res = (new User($data))->save(); //此时数据表名为user、模型类名为User
2、添加多条数据
$data = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$res = (new User())->saveAll($data); //此时数据表名为user、模型类名为User
3、更新一条数据:
$res = (new admin())->save($data,['admin_id'=>106]);
4、批量更新数据(saveAll只能根据主键进行批量更新,其他请使用遍历):
$data = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$res = (new admin())->save($data);
模型层数据库自动写入create_time和update_time:
'auto_timestamp' => false, //在数据库配置文件里面,把这个改成true即可。
类的任何方法都能使用的变量:
class Category extends Controller{
private $obj;
//设置一个所有方法都能用的变量
public function _initialize()
{
parent::_initialize(); // TODO: Change the autogenerated stub
$this->obj = model('Category');
}
//获取列表
public function List(){
$categorys = $this->obj->getCategoryList();
halt($categorys);
}
}
//这里,我们需要特别讲解一下,为什么要用一个构造函数来设置$obj的值,而不直接在上面设置。因为:外面能直接设置字符串,但是当你的公用的变量需要调用其他的方法,函数的时候,就不行了。所以,使用构造函数进行设置公用的值,是为了,如果需要调用其他方法或函数的时候,仍然能够调用的到。
模板中不同状态不同文字的解决方法:
//以前我们采用的是模板中的if判断语句,比较麻烦,比如:
{if condition="($repairInfo.is_repair == 0)"}
<button class="submit">点击确认已维修</button>
{elseif condition="$repairInfo.is_repair == 1"/}
<button class="submit" style=" " disabled>已确认</button>
{else /}
<button class="submit" disabled>出错了</button>
{/if}
现在的方法:--->>>看以下:
模板位置使用函数使用:或者把函数加在 | 后面
{$repairInfo.is_repair|is_repair} 或者 {:is_repair($repairInfo.is_repair)}
common.php加入以下函数:
function is_repair($is_repair){
if($is_repair == 0){
$str = '<button class="submit">点击确认已维修</button>';
}elseif ($is_repair == 1){
$str = '<button class="submit" style=" " disabled>已确认</button>';
}else{
$str = '<button class="submit" disabled>出错了</button>';
}
return $str;
}
foreach的使用:
foreach ($data as $key => $value) {
$row .= $value['admin_id'].',';
}
php判断一维还是二位数组:
if(count($arr) == count($arr,1)){
echo "是一维";
}else{
echo "不是一维";
}
方法接收到数据,读出来的方法:
$xml = file_get_contents('php://input'); //读取POST数据,不能用于multipart/form-data类型
//英文全部大写:
strtoupper("Hello WORLD123!");
//英文全部小写:
strtolower("Hello WORLD123!");
//首字母大写:
ucwords("Hello WORLD123!");
// 使用路由: ——开启路由完全匹配
基本表达式:Route::rule('new/:id','News/read','GET|POST');
快捷表达式:(:id是参数)
Route::get('new/:id','News/read'); // 定义GET请求路由规则
Route::post('new/:id','News/update'); // 定义POST请求路由规则
Route::put('new/:id','News/update'); // 定义PUT请求路由规则
Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
路由到多级控制器:Route::get('blog/:id','index/group.blog/read');
路由到模板:Route::view('hello/:name','index@hello',['city'=>'shanghai']);
路由设置允许跨域:
Route::get('new/:id', 'News/read')
->ext('html')
->header('Access-Control-Allow-Origin','thinkphp.cn')
->header('Access-Control-Allow-Credentials', 'true')
->allowCrossDomain();
路由分组:
Route::group('blog', function () {
Route::get(':id', 'read');
Route::post(':id', 'update');
Route::delete(':id', 'delete');
})->prefix('blog/');
// 容器:
可以在provide中手动将类绑定到容器中,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。
依赖注入的类统一由容器进行管理,大多数情况下是在自动绑定并且实例化的。
// facade:
为类提供一个静态调用接口
// 生成url
url('index/blog/read', ['id' => 5, 'name' => 'thinkphp']);
// 相应:
// 未指定状态码,则默认状态码重定向为302,其余为200
json($data,201);
view($data,401);
json($data)->code(201)->header([
'Cache-control' => 'no-cache,must-revalidate'
]); //可设置多个
// 重定向:
redirect('hello',['name'=>'thinkphp']);
// 请求信息:(以门脸模式举例,还有依赖注入的方式)
use think\facade\Request;
$data = Request::routeInfo(); //获取请求信息等
$data = Request::param('name'); //获取请求的变量
Request::param(); //获得所有参数
Request::header(); //获取头部信息
助手函数举例:
input('param.name'); // 获取单个参数
input('param.'); // 获取全部参数
// 下面是等效的
input('name');
input('');
浙公网安备 33010602011771号