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('');

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-11-27 14:54  小寒1206  阅读(745)  评论(0)    收藏  举报