# TP8 **Repository Path**: uyevan/tp8 ## Basic Information - **Project Name**: TP8 - **Description**: 🦢 ThinkPHP8框架的基础使用与体验记录 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-06-13 - **Last Updated**: 2025-05-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: ThinkPHP, PHP, Redis, MySQL, Bootstrap ## README 睁眼间TP框架也更新到了第八个版本,今天去使用了一下,初期创建存在一些问题,这里记录一下,然后再根 PHP 、ThinkPHP 说声再见了。 ### 1.环境要求 **PHP ≥ 8.0 (必须、建议不要再使用 8.0 一下版本)** [PHP: Hypertext Preprocessor](https://www.php.net/) **Composer ≥ 2.7.5 (非必须、建议用最新版本)** Composer类似于Python的pip / Node的npm; [Composer](https://getcomposer.org/) ### 2.创建一个TP8项目 - 创建:`composer create-project topthink/think MyProject` - 更新(后期有需可更新):`composer update topthink/framework` 🦢 问题1:不要高兴太早,此时 composer 可能会报错:) **为什么:**版本不匹配,【php与composer与TP所需依赖版本不匹配或冲突】 **怎么办:** 分别执行`composer install --ignore-platform-reqs` 和 `composer update --ignore-platform-reqs` ### 3.配置多应用模式 您可以选择继续使用单应用模式,**默认是单应用模式;**但我一直以来使用的多应用模式,因为具有高扩展性、灵活性,可维护性等; - 打开`config/app.php`应用配置目录修改成:`'auto_multi_app' => true,` - 删除`app`目录下的`controller、model、view`等文件夹【因为这些是单应用的默认目录,我们要改成多应用】 - 安装多应用模式扩展包,项目目录下终端执行:`composer require topthink/think-multi-app` - 安装多应用模式View视图扩展包,项目终端执行:`composer require topthink/think-view` - 创建一个应用,项目目录下终端执行:`php think build 应用名` 此时你完成多应用的配置与安装,此时您的目录结构为: ```SQL MyProject WEB部署目录(或者子目录) ├─app 应用目录 │ ├─app_1_name 应用目录 │ │ ├─common.php 函数文件 │ │ ├─controller 控制器目录 │ │ ├─model 模型目录 │ │ ├─view 视图目录 │ │ ├─config 配置目录 │ │ ├─route 路由目录 │ │ └─ ... 更多类库目录 │ ├─app_2_name 应用目录 │ │ ├─common.php 函数文件 │ │ ├─controller 控制器目录 │ │ ├─model 模型目录 │ │ ├─view 视图目录 │ │ ├─config 配置目录 │ │ ├─route 路由目录 │ │ └─ ... 更多类库目录 │ │ │ ├─common.php 公共函数文件 │ └─event.php 事件定义文件 │ ├─config 全局配置目录 │ ├─app.php 应用配置 │ ├─cache.php 缓存配置 │ ├─console.php 控制台配置 │ ├─cookie.php Cookie配置 │ ├─database.php 数据库配置 │ ├─filesystem.php 文件磁盘配置 │ ├─lang.php 多语言配置 │ ├─log.php 日志配置 │ ├─middleware.php 中间件配置 │ ├─route.php URL和路由配置 │ ├─session.php Session配置 │ ├─trace.php Trace配置 │ └─view.php 视图配置 │ ├─public WEB目录(对外访问目录) │ ├─index.php 入口文件 │ ├─router.php 快速测试文件 │ └─.htaccess 用于apache的重写 │ ├─extend 扩展类库目录 ├─runtime 应用的运行时目录(可写,可定制) ├─vendor Composer类库目录 ├─.example.env 环境变量示例文件 ├─composer.json composer 定义文件 ├─LICENSE.txt 授权说明文件 ├─README.md README 文件 ├─think 命令行入口文件 ``` ### 4.启动应用 项目目录下终端执行`php think run`来启动项目,默认端口是:**8000,**您可以`php think run -p 80`来指定端口;浏览器访问`localhost:8000`或`localhost`即可; ### 5.Nginx配置 不配置也可以,但配置了UTR会不会很长,而且不需要每次都要带上`index.php`; 【配置前】:**域名/public/index.php/应用/控制器/操作函数/参数名/参数值** 【配置后】:**域名/控制器/操作函数** 进入`public/nginx.htaccess`写入如下规则: ```Nginx location / { if (!-f $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; } } ``` ### 6.实例版本 **重要!重要!重要! 没有实例解决不了的问题!**🧑💻 - 目录结构:一下是我的项目结构,目前就一个应用,其他应用也类似; []()https://flowus.cn/uyevan/e4a5a6dc-ae1f-49a7-be81-91443bac68e6 - MySQL数据库配置:config/database.php里配置数据库信息: []()https://flowus.cn/uyevan/e4a5a6dc-ae1f-49a7-be81-91443bac68e6 **问题2:此时可能会报错,因为你没开启PHP的数据库Dvice启动模块;** **解决办法:进入PHP安装目录,找到**`php.ini`配置文件,找到`;extension=pdo_mysql`和`;extension=mysqli`把前面的`;`冒号删除保存退出即可;再重新`php think run -p 80`来启动项目; - 应用结构:我的`api`应用的MVC结构大致如下,看不懂也没关系自己写一遍就一目了然了: []()https://flowus.cn/uyevan/e4a5a6dc-ae1f-49a7-be81-91443bac68e6 - 具体代码:这是我创建项目到完成增删改查的过程中写过的几个文件代码【其实完全可以缩小到2~3个文件,甚至一个文件,但我们要考虑**可维护,可测试,可扩展**】: ```PHP studentService = $studentServiceImpl; parent::__construct($app); } /** * 返回View视图 * @return string */ public function index(): string { return View::fetch(); } public function getAllStudent(): bool|string { return $this->studentService->getAllStudent(); } public function getStudentById(): bool|string { return $this->studentService->getStudentById(); } public function addStudent(): bool|string { return $this->studentService->addStudent(); } public function updateStudent(): bool|string { return $this->studentService->updateStudent(); } public function deleteStudent(): bool|string { return $this->studentService->deleteStudent(); } } ``` ```PHP 'int', 'name' => 'varchar', 'sex' => 'varchar', 'birth' => 'int', 'department' => 'varchar', 'address' => 'varchar' ]; } ``` ```PHP input('name') ?: null, 'sex' => input('sex') ?: null, 'birth' => input('birth') ?: null, 'department' => input('department') ?: null, 'address' => input('address') ?: null ]; $student = new Student(); $student->save($studentParam); return CustomJsonResult(code: 200, msg: '添加成功'); } public function updateStudent(): bool|string { // TODO: Implement updateStudent() method. $studentParam = [ 'id' => input('id') ?: null, 'name' => input('name') ?: null, 'sex' => input('sex') ?: null, 'birth' => input('birth') ?: null, 'department' => input('department') ?: null, 'address' => input('address') ?: null ]; $student = Student::find($studentParam['id']); $student->save($studentParam); return CustomJsonResult(code: 200, msg: '更新成功'); } public function deleteStudent(): bool|string { // TODO: Implement deleteStudent() method. $id = input('id') ?: null; Student::destroy($id); return CustomJsonResult(code: 200, msg: '删除成功'); } } ``` ```HTML