本文实例讲述了从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记。分享给大家供大家参考,具体如下:
用tp3.2.3做了不少项目,但是毕竟要与时代接轨,学习一些新的框架,比如tp5
以下记录一些学习中遇到的问题及解决办法,还有tp3.2和tp5.0的一些区别,适合给用过tp3没用过tp5的童鞋做个参考。
随着学习不断更新......
+++++++++++++++++++++++分割线总是要有的+++++++++++++++++++++++
首先到tp官网下载了一个最新的ThinkPHP5.0.22完整版:
直接扔到了服务器上,解压后目录结构如下:
目录结构整体与tp3.2大同小异,文件夹首字母小写了,应用入口文件 在根目录下 public/index.php,官方文档对public文件夹定义为WEB部署目录(对外访问目录):
配置服务器域名解析的时候需要把项目根目录指向/public:
<VirtualHost *:80> ServerAdmin 1977629361@qq.com DocumentRoot /var/www/tp/public ServerName tp.oyhdo.com ServerAlias tp.oyhdo.com DirectoryIndex index.php index.html index.htm </VirtualHost>
根目录下 application/config.php 为应用(公共)配置文件,设置一些常用的配置,以下简称为“配置文件”:
访问网址如下:
访问tp.oyhdo.com等同于访问tp.oyhdo.com/index.php/index/Index/index(默认不区分大小写)
即默认模块index,默认控制器Index,默认操作index
配置文件修改分别为default_module、default_controller、default_action
如果需要强制区分url大小写,修改 url_convert 为false
:
配置文件中设置 app_debug 为true
,打开应用调试模式,以便开发调试:
【隐藏url中的index.php入口文件】
以Apache服务器为例,首先确认Apache配置文件httpd.conf中开启了mod_rewrite.so模块:
然后把所有【AllowOverride】设为All:
最后修改根目录下 public/.htaccess 文件内容为:
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php"color: #0000ff">index.php也可访问:【隐藏前台url模块名】
把index模块作为前台,在前台新建了一个User控制器:
<"has" alt="" width="471" height="177" src="/UploadFiles/2021-04-02/2019040310144313.png">为了前台url显示简洁一些,要去掉模块名index,然后就崩了:
如果只有一个模块,可以在 /application/common.php 中添加:
// 绑定当前访问到index模块 define('BIND_MODULE','index');亲测访问成功:
但是项目通常会有前后台的区分,至少两个模块, 用上面的方法绑定index模块后,再访问其它模块就会报错:
(新建了一个admin模块作为后台)
<"has" alt="" width="685" height="327" src="/UploadFiles/2021-04-02/2019040310144317.png">对于多模块的情况,可以在 /application/route.php 中绑定默认模块路由(去掉上面的单模块绑定):
use think\Route; Route::bind('index');前台访问成功:
然后在/public/下新建一个入口文件admin.php,绑定后台模块admin,来访问后台:
<"has" alt="" width="481" height="185" src="/UploadFiles/2021-04-02/2019040310144320.png">(修改后台地址只需修改这个文件名即可)
【返回数据】
配置文件中默认输出类型 default_return_type 为html:
直接打印输出字符串、数组,没什么特殊:
public function index() { $str = 'hello,world!'; $arr = array('state'=>1,'msg'=>'success'); //打印字符串 echo $str; //打印数组 var_dump($arr); }返回json格式数据:
public function index() { $arr = array('state'=>1,'msg'=>'success'); return json($arr); //返回其它状态码或响应头信息 //return json($arr, 201, ['Cache-control' => 'no-cache,must-revalidate']); //xml格式 //return xml($arr); }(对于只做API开发的情况,可以设置default_return_type为json,直接
return $arr
即可返回json格式数据)
【渲染模板、分配数据】
如图建立视图层,index.html作为前台首页(内容为“这是首页”):
tp3渲染模板直接在控制器里
$this->display()
,tp5并不支持。tp5渲染模板,在控制器中继承think\Controller类,使用
return $this->fetch()
或者使用助手函数return view()
:<"has" alt="" width="436" height="162" src="/UploadFiles/2021-04-02/2019040310144325.png">tp5分配数据的方式依旧使用
$this->assign()
:<"htmlcode">{$name}(修改模板引擎标签 配置文件【tpl_begin】、【tpl_end】)
【继承父类控制器】
写一个栗子,新建一个Base控制器作为父类控制器,Index控制器继承Base控制器
在父类控制器中初始化分配数据,子类控制器渲染模板:
Base.php:
<"htmlcode"><"htmlcode">{$haha}(与tp3.2相比,父类控制器不能是Public控制器)
【配置参数】
tp3.2里面使用C方法设置、获取配置参数
tp5使用助手函数
config()
设置、获取配置参数://配置一个参数 config('name','lws'); //批量配置参数 config([ 'info'=>['sex'=>'nan','aihao'=>'nv'] ]); //获取一个配置参数 echo config('name'); //获取一组配置参数 dump(config('info')); //获取一个二级配置参数 echo config('info.sex');【get传参】
tp5废除了url/参数名1/参数值1/参数名2/参数值2......这样的方式传参,还是老老实实用url"htmlcode">
<"has" alt="" width="672" height="326" src="/UploadFiles/2021-04-02/2019040310144430.png">这样就好使:
【安全获取变量】
tp3.2可以使用I方法安全获取get、post等系统输入变量
tp5中使用助手函数
input()
//获取get变量 $data1 = input('get.name'); //获取post变量 $data2 = input('post.name'); //获取当前请求变量 $data3 = input('param.name'); //获取request变量 $data4 = input('request.name'); //获取cookie变量 $data5 = input('cookie.name'); //获取session变量 $data6 = input('session.name'); //获取上传文件信息 $data7 = input('file.image');(注意:获取的数据为数组,要加上 /a 修饰符才能获取到)
$arr = input('post.arr/a');可以在配置文件中设置全局过滤方法:
// 默认全局过滤方法 用逗号分隔多个 'default_filter' => 'htmlspecialchars',【数据库操作】
tp5的数据库配置文件在根目录 /application/database.php:(也可在模块下单独配置)
连接数据库:tp3.2支持M方法连接数据库,tp5使用 Db类 或 助手函数
db()
查询数据:依旧使用
find()
、select()
方法,查询一个字段使用value()
方法代替getField()
//查询一条 $artinfo = db('article')->find(); //查询全部 $artinfo = db('article')->select(); //查询一个字段 $artinfo = db('article')->value('article_title');添加数据:tp3.2使用
add()
,tp5使用insert()
:返回插入条数 或save()
:返回id//添加一条数据 $data['article_title'] = 'PHP是世界上最好的语言'; $data['article_content'] = '如题'; db('article')->insert($data); //或 db('article')->save($data);//添加多条数据 $data = [ ['article_title' => '标题1', 'article_content' => '内容1'], ['article_title' => '标题2', 'article_content' => '内容2'], ['article_title' => '标题3', 'article_content' => '内容3'] ]; db('article')->insertAll($data);修改数据:tp3.2使用
save()
,tp5使用update()
//修改数据 $whe['article_id'] = 1; $data['article_title'] = '修改后的标题'; db('article')->where($whe)->update($data);删除数据:没错还是
delete()
//删除数据 $whe['article_id'] = 1; db('article')->where($whe)->delete();
db()
助手使用起来比较方便,但每次都会重新连接数据库,因此应当尽量避免多次调用,建议还是使用Db类操作数据库。Db类操作原生SQL:
<"标题", "内容")'); // 删除数据 $res = Db::execute('delete from lws_article where art_id = 1 '); // 更新记录 $res = Db::execute('update lws_article set title = "修改标题" where art_id = 1 '); // 查询数据 $res = Db::query('select * from lws_article where art_id = 1'); // 显示数据库列表 $res = Db::query('show tables from blog'); // 清空数据表 $res = Db::execute('TRUNCATE table lws_article'); } }Db类操作查询构造器:
<"修改标题"]); // 查询数据 $res = Db::name('article') ->where('art_id', 1) ->select(); // 删除数据 $res = Db::name('article') ->where('art_id', 1) ->delete(); //链式操作举例 $artlist = Db::name('article') ->where('is_del', 'N') ->field('id,title,content') ->order('post_time', 'desc') ->limit(10) ->select(); } }【切换数据库】
首先在数据库配置中配置多个数据库:
// 数据库配置1 'db1' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'blog1', // 数据库用户名 'username' => 'root', // 数据库密码 'password' => '123456', // 数据库连接端口 'hostport' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => 'lws_', ], // 数据库配置2 'db2' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'blog2', // 数据库用户名 'username' => 'root', // 数据库密码 'password' => '', // 数据库连接端口 'hostport' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => 'lws_', ],使用connect方法切换数据库:
<"htmlcode">REQUEST_METHOD IS_GET IS_POST IS_PUT IS_DELETE IS_AJAX __EXT__ COMMON_MODULE MODULE_NAME CONTROLLER_NAME ACTION_NAME APP_NAMESPACE APP_DEBUG MODULE_PATH等需要使用的常量可以自己定义,例如IS_GET、IS_POST
我在父类的初始化方法中定义了这两个常量:
<"htmlcode"><"color: #0000ff">http://oyhdo.com/home/article/detial"color: #0000ff">application/route.php 中添加路由规则:return [ 'article/:id' => 'home/article/detial', ];或者使用 Route 类,效果一样:
use think\Route; Route::rule('article/:id','home/article/detial');定义路由规则之后访问http://oyhdo.com/article/50即可
【url分隔符的修改】修改 application/config.php 中的 pathinfo_depr :
// pathinfo分隔符 'pathinfo_depr' => '-',访问网址变为:http://oyhdo.com/article-50
【跳转、重定向】
tp3里面的正确跳转:
$this->success()
、错误跳转:$this->error()
、重定向:$this->redirect()
,在tp5里面同样适用(继承\think\Controller)tp5新增
redirect()
助手函数用于重定向:return redirect('https://www.oyhdo.com');更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!暂无评论...P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年11月28日2024年11月28日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]