近日,由于我的博客(猿小莫)服务器的迁移,就想改用PHP7,顺便把博客老旧的框架(thinkphp3.2)跨跃到最新的ThinkPHP6框架,自此在踩坑路上一去不复返。
众所周知,从ThinkPHP5.1开始,官方网站已不再提供框架源码下载啦,所以,ThinkPHP6.0(以下简称TP6)当然也不能从官网下载,因此,我们首先根据官方推荐方法,运用composer下载好项目。(Thinkphp6官方文档地址)
目录结构如下:
目录结构整体与tp3.2大同小异,文件夹首字母小写了,应用入口文件 在根目录下 public/index.php,官方文档对public文件夹定义为WEB部署目录(对外访问目录):
根目录下 config/app.php 为应用(公共)配置文件,设置一些常用的配置,以下简称为“配置文件”:
在web根目录文件夹内地址栏上执行cmd:(或者进入本地Xshell)
php think run
出现如下图:
将生成的127.0.0.1:8000 放到浏览器运行:(该cmd不能关闭)
出现如上图所示页面即代表安装成功。服务器部署方法请移步如何从0到1在linux部署thinkphp6项目
默认安装后的根目录有一个.example.env环境变量示例文件,你可以直接改成.env文件后进行修改。文件默认开启了调试模式。
即可看到熟悉的调试界面
正常项目通常会有前后台的区分,至少两个模块。我们新建了一个admin模块作为后台。
//如果要使用多应用模式,你需要安装多应用模式扩展think-multi-app。
composer require topthink/think-multi-app
(新建的admin模块)
对于多模块的情况,可以在 /config/app.php 中设置默认模块模块:
前台访问成功:
然后在/public/下新建一个入口文件admin.php,绑定后台模块admin,来访问后台:
// [ 应用入口文件 ]
namespace think;require __DIR__ . '/../vendor/autoload.php';
// 执行HTTP应用并响应
$http = (new App())->http;
//设置当前入口文件默认绑定到admin模块
$response = $http->name('admin')->run();
$response->send();$http->end($response);
后台访问成功:
(修改后台地址只需修改这个文件名即可)
tp3渲染模板直接在控制器里$this->display(),tp6并不支持。
tp6的视图功能由\think\View类配合视图驱动(也即模板引擎驱动)类一起完成,新版仅内置了PHP原生模板引擎(主要用于内置的异常页面输出),因此我们需要通过composer 安装think-view 模板引擎驱动,来使用think-template模板引擎。
composer require topthink/think-view
如图建立视图层,index.html作为前台首页(内容为“这是首页”):
注意:这是多应用模式下index模块下的index类(控制器)下的index页面(方法)
tp6渲染模板,在控制器中引入think\facade\View,使用静态方法 return View::fetch() 或者使用助手函数 return view():
tp6输出数据的方式使用静态方法View::assign('name','ThinkPHP'),或者使用助手函数return view():
'ThinkPHP'
]);
}
}
index.html页面读取数据:
{$name}
tp6的数据库配置文件在根目录 /config/database.php:(也可在模块下单独配置)
连接数据库: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踩坑记录 | 猿小莫的博客