侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解

ThinkPHP  /  管理员 发布于 8年前   200

本文实例讲述了从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:

 ServerAdmin [email protected] DocumentRoot /var/www/tp/public ServerName tp.oyhdo.com ServerAlias tp.oyhdo.com DirectoryIndex index.php index.html index.htm 

根目录下 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 文件内容为:

 Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
去掉index.php也可访问:

【隐藏前台url模块名】 

把index模块作为前台,在前台新建了一个User控制器:

 正常需要这样访问User控制器的user操作:

 为了前台url显示简洁一些,要去掉模块名index,然后就崩了:

如果只有一个模块,可以在 /application/common.php 中添加:

// 绑定当前访问到index模块define('BIND_MODULE','index');

亲测访问成功:

但是项目通常会有前后台的区分,至少两个模块, 用上面的方法绑定index模块后,再访问其它模块就会报错:

(新建了一个admin模块作为后台)

 

对于多模块的情况,可以在 /application/route.php 中绑定默认模块路由(去掉上面的单模块绑定):

use think\Route;Route::bind('index');

前台访问成功:

 然后在/public/下新建一个入口文件admin.php,绑定后台模块admin,来访问后台:

send();

后台访问成功:

(修改后台地址只需修改这个文件名即可)
 

【返回数据】

配置文件中默认输出类型 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():

fetch(); //return view(); }}

tp5分配数据的方式依旧使用 $this->assign():

assign('name',$name); return $this->fetch(); }}

index.html页面读取数据:

{$name}

(修改模板引擎标签 配置文件【tpl_begin】、【tpl_end】)

【继承父类控制器】

写一个栗子,新建一个Base控制器作为父类控制器,Index控制器继承Base控制器

在父类控制器中初始化分配数据,子类控制器渲染模板:

Base.php:

assign('haha',$haha); }}

Index.php:

fetch(); }}

index.html:

{$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?参数名1=参数值1&参数名2=参数值2......这样传吧。

控制器里打印$_GET:

 这样是不对滴:

这样就好使:

【安全获取变量】 

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:

Db类操作查询构造器:

where('art_id', 1) ->select();//以下为数据库配置了表前缀// 插入记录$res = Db::name('article')->insert(['title' => '标题', 'content' => '内容']);// 更新记录$res = Db::name('article')->where('art_id', 1)->update(['title' => "修改标题"]);// 查询数据$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方法切换数据库:

query('select * from lws_article where art_id = 1'); $db2->query('select * from lws_article where art_id = 2'); }}

【系统常量】

tp5废除了一大堆常量:

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

我在父类的初始化方法中定义了这两个常量:

isGet()); define('IS_POST',request()->isPost()); }}

然后在子类控制器中就可以使用这个常量做一些判断:

【定义路由】

例如一篇博客详情页,原来的网址为:http://oyhdo.com/home/article/detial?id=50,即home模块下的article控制器下的detial操作方法,传递参数id。

在路由配置文件 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程序设计有所帮助。

您可能感兴趣的文章:

  • thinkPHP5.0框架URL访问方法详解
  • 学习thinkphp5.0验证类使用方法
  • 在thinkphp5.0路径中实现去除index.php的方式


  • 上一条:
    ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
    下一条:
    PHP小程序支付功能完整版【基于thinkPHP】
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客