从ThinkPHP3.2到ThinkPHP6踩坑记录

近日,由于我的博客(猿小莫)服务器的迁移,就想改用PHP7,顺便把博客老旧的框架(thinkphp3.2)跨跃到最新的ThinkPHP6框架,自此在踩坑路上一去不复返。

众所周知,从ThinkPHP5.1开始,官方网站已不再提供框架源码下载啦,所以,ThinkPHP6.0(以下简称TP6)当然也不能从官网下载,因此,我们首先根据官方推荐方法,运用composer下载好项目。(Thinkphp6官方文档地址)

从ThinkPHP3.2到ThinkPHP6踩坑记录_第1张图片

目录结构如下:

从ThinkPHP3.2到ThinkPHP6踩坑记录_第2张图片

目录结构整体与tp3.2大同小异,文件夹首字母小写了,应用入口文件 在根目录下 public/index.php,官方文档对public文件夹定义为WEB部署目录(对外访问目录):

从ThinkPHP3.2到ThinkPHP6踩坑记录_第3张图片

根目录下 config/app.php 为应用(公共)配置文件,设置一些常用的配置,以下简称为“配置文件”:

从ThinkPHP3.2到ThinkPHP6踩坑记录_第4张图片

在web根目录文件夹内地址栏上执行cmd:(或者进入本地Xshell)

php  think  run

出现如下图:

images/20211227/d5f4f87cb8011b5ce2fd4d3029a01f1b.png

将生成的127.0.0.1:8000 放到浏览器运行:(该cmd不能关闭)

从ThinkPHP3.2到ThinkPHP6踩坑记录_第5张图片

出现如上图所示页面即代表安装成功。服务器部署方法请移步如何从0到1在linux部署thinkphp6项目

开启调试模式

默认安装后的根目录有一个.example.env环境变量示例文件,你可以直接改成.env文件后进行修改。文件默认开启了调试模式。

从ThinkPHP3.2到ThinkPHP6踩坑记录_第6张图片

即可看到熟悉的调试界面

images/20211228/b9c366b74df34f3af937b22d5126cf02.png

多应用模式

正常项目通常会有前后台的区分,至少两个模块。我们新建了一个admin模块作为后台。

//如果要使用多应用模式,你需要安装多应用模式扩展think-multi-app。
composer require topthink/think-multi-app

(新建的admin模块)

从ThinkPHP3.2到ThinkPHP6踩坑记录_第7张图片

从ThinkPHP3.2到ThinkPHP6踩坑记录_第8张图片

对于多模块的情况,可以在 /config/app.php 中设置默认模块模块:

从ThinkPHP3.2到ThinkPHP6踩坑记录_第9张图片

前台访问成功:

从ThinkPHP3.2到ThinkPHP6踩坑记录_第10张图片

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

从ThinkPHP3.2到ThinkPHP6踩坑记录_第11张图片

// [ 应用入口文件 ]
namespace think;require __DIR__ . '/../vendor/autoload.php';
// 执行HTTP应用并响应
$http = (new App())->http;
//设置当前入口文件默认绑定到admin模块
$response = $http->name('admin')->run();
$response->send();$http->end($response);

后台访问成功:

从ThinkPHP3.2到ThinkPHP6踩坑记录_第12张图片

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

视图层渲染模板、输出数据

tp3渲染模板直接在控制器里$this->display(),tp6并不支持。

tp6的视图功能由\think\View类配合视图驱动(也即模板引擎驱动)类一起完成,新版仅内置了PHP原生模板引擎(主要用于内置的异常页面输出),因此我们需要通过composer 安装think-view 模板引擎驱动,来使用think-template模板引擎。

composer require topthink/think-view

如图建立视图层,index.html作为前台首页(内容为“这是首页”):

从ThinkPHP3.2到ThinkPHP6踩坑记录_第13张图片

注意:这是多应用模式下index模块下的index类(控制器)下的index页面(方法)

tp6渲染模板,在控制器中引入think\facade\View,使用静态方法 return View::fetch() 或者使用助手函数 return view():

从ThinkPHP3.2到ThinkPHP6踩坑记录_第14张图片

tp6输出数据的方式使用静态方法View::assign('name','ThinkPHP'),或者使用助手函数return view():

 'ThinkPHP'        
      ]); 
   }
}

index.html页面读取数据:

{$name}

从ThinkPHP3.2到ThinkPHP6踩坑记录_第15张图片

数据库操作

tp6的数据库配置文件在根目录 /config/database.php:(也可在模块下单独配置)

从ThinkPHP3.2到ThinkPHP6踩坑记录_第16张图片

连接数据库:tp3.2支持M方法连接数据库,tp6引入\think\facade\Db使用静态方法Db::name

查询数据:依旧使用 find()、select() 方法,查询一个字段使用 value()、column() 方法代替getField()

//查询一条
$artinfo = Db::name('Blogs')->find(); 
//查询全部
$artinfo = Db::name('Blogs')->select(); 
//查询一个字段
$artinfo = Db::name('Blogs')->value('name');
//查询某一列的值可以用
$artinfo = Db::name('Blogs')->column('name', 'id');

添加数据:tp3.2使用add(),tp6使用 insert():返回插入条数  或  save():返回id

//添加一条数据
$data['name'] = 'ThinkPHP6.0';
$data['content'] = '内容';
Db::name('Blogs')->insert($data);

//添加多条数据
$dataArr = [    
   ['name' => '标题1', 'content' => '内容1'],    
   ['name' => '标题2', 'content' => '内容2'],    
   ['name' => '标题3', 'content' => '内容3']
];
Db::name('Blogs')->insertAll($dataArr );

修改数据:tp3.2使用save(),tp6使用 update()

//修改数据
$where['id'] = 1;
$data['name'] = '修改后的标题';
Db::name('Blogs')->where($where)->update($data);

删除数据:没错还是 delete()

//删除数据
$where['article_id'] = 1;
Db::name('article')->where($where)->delete();

模型查询:tp3.2支持D方法,tp6增加了静态方法

User::get(1);
User::all();
User::where('id','>',10)->find();

系统常量

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等

//tp3.2
IS_POST
//tp6改为
request()->isPost()

//tp3.2
ACTION_NAME
//tp6改为
request()->action()

//tp3.2
CONTROLLER_NAME
//tp6改为
request()->controller()

安全获取变量

tp3.2可以使用I方法安全获取get、post等系统输入变量。

tp6中使用助手函数 input()。

//获取get变量
$data1 = input('get.name'); 
//获取post变量
$data2 = input('post.name'); 
//获取当前请求变量
$data3 = input('param.name');    
//获取上传文件信息
$data4 = input('file.image');

注意:tp6系统推荐的获取请求参数的方法是通过引入\think\Request使用静态方法Request::param

// 获取当前请求的name变量
Request::param('name');
// 获取当前请求的所有变量(经过过滤)
Request::param();
// 获取当前请求未经过滤的所有变量
Request::param(false);
// 获取部分变量
Request::param(['name', 'email']);


//例如访问地址是http://localhost/index.php/index/index/hello/name/thinkphp
//正确方法
echo Request::param('name'); // 输出thinkphp
//错误方法1
echo Request::get('name'); // 输出为空
//错误方法2
echo input('get.name'); // 输出为空
//错误方法3
echo input('param.name'); // 输出为空

跳转、重定向

tp3里面的正确跳转:$this->success()、错误跳转:$this->error()、重定向:$this->redirect(),在tp6里面,官方系统不再提供基础控制器类think\Controller,原来的success、error、redirect和result方法需要自己在基础控制器类里面实现。

tp6新增 redirect() 助手函数用于重定向:

return redirect('https://www.baidu.com');

以上是个人的一些愚见,如有不足请大家多多谅解。

文章来源:从ThinkPHP3.2到ThinkPHP6踩坑记录 | 猿小莫的博客

你可能感兴趣的:(php,php,thinkphp)