从ThinkPHP3.2到ThinkPHP6踩坑记录

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

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

images/20211227/354da5cd00e6511c3ece5ee1ed89ed71.png

目录结构如下:

images/20211227/22724ea3b4e328429fee5930c3931f6f.png

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

images/20211227/912a980978da2dad98fa0a01d3a26b5d.png

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

images/20211227/849c3ea1f86b2ee390b660ef5b2f0926.png

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

php  think  run

出现如下图:

images/20211227/d5f4f87cb8011b5ce2fd4d3029a01f1b.png

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

images/20211227/c0c70e5f58688c925d61f0979d305e8b.png

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

开启调试模式

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

images/20211228/0fc25f78b8e0d3fd6eed46b1b5c62e10.png

即可看到熟悉的调试界面

images/20211228/b9c366b74df34f3af937b22d5126cf02.png

多应用模式

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

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

(新建的admin模块)

images/20211228/7c24c1e0540e630b115bdf67de1a2f3a.png

<?php
namespace app\admin\controller;
class Index{    
   public function index()    
   {        
      return '这是后台首页';    
   }
}

//控制器写法也由class IndexController变成class Index 
//控制器命名也由IndexController.class.php变成Index.php

images/20211228/aff24e7bf270cb192f6f73b11a8777be.png

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

images/20211228/792d970b8c8f311e8ee5d1d65d9a598e.png

前台访问成功:

images/20211228/6745646f6437910457c75fda02192707.png

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

images/20211228/be5939d3c8f5a667614744212554de48.png

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

后台访问成功:

images/20211228/daeedc5c2d450c6c0598fa971500417c.png

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

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

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

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

composer require topthink/think-view

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

images/20211228/5bc5df1a6e716cbed3531f95d38fac56.png

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

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

<?php
namespace app\index\controller;
use think\facade\View;
class Index{    
   public function index()    {        
      return View::fetch();    
   }
}

images/20211228/519dcfb6a292eb8cbf6f995390f475fa.png

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

<?php
namespace app\index\controller;
use think\facade\View;
class Index{    
   public function index()    {        
      View::assign('name','ThinkPHP');        
      return View::fetch(); 
        
      //或者助手函数
      return view('index', [            
         'name'  => 'ThinkPHP'        
      ]); 
   }
}

index.html页面读取数据:

{$name}

images/20211228/3ad9fae42a978709f2fc2f8a812cf10a.png

数据库操作

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

images/20211228/babb81324843661d8ec5634d05863581.png

连接数据库: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踩坑记录 | 猿小莫的博客

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值