ThinkPHP 6.0五大核心目录为app、public、config、route、runtime:app存放业务代码且命名空间为App\;public为唯一Web入口,含index.php和静态资源;config集中管理配置并自动加载;route负责URL路由映射;runtime为框架自动生成的缓存与日志目录,需可写。

刚用Composer拉完ThinkPHP 6.0项目,看到tp6目录里一堆文件夹却不知道哪个该改、哪个绝不能动,连public/index.php都犹豫要不要碰——这不是配置问题,是没看懂它的结构逻辑。手册不是用来从头到尾读的,而是按需查、按场景翻、按错误定位找依据。
看清五大核心目录,先别急着写代码
打开项目根目录,盯住这五个不可删、不可挪、必须理解作用的目录:app、public、config、route、runtime。
app目录是业务代码唯一合法落脚点,所有控制器、模型、中间件类都必须放在这里,且命名空间自动映射为App\,【删掉app目录等于删掉整个应用逻辑】。
public是Web服务器唯一能直接访问的目录,index.php是唯一入口,.htaccess或Nginx规则只对它生效;static资源(CSS/JS/图片)必须放public下,放错位置浏览器会404。
立即学习“PHP免费学习笔记(深入)”;
config目录集中管理所有配置项,database.php控制数据库连接,view.php决定模板引擎行为,middleware.php注册全局中间件——这些文件不手动加载,框架启动时自动读取。
route目录只管一件事:把URL路径翻译成“哪个控制器+哪个方法”,route.php里写Route::get('user/:id', 'user/read'),访问/user/123才会触发User控制器的read方法。
runtime是框架自动生成的缓存与日志仓库,包含cache、log、temp、view四个子目录;【部署时必须确保该目录可写,否则路由缓存无法生成、日志无法记录】。
创建第一个控制器:三步走通MVC起点
第一步:在app/controller目录下新建Index.php文件。
第二步:文件内容严格遵循命名规范,类名与文件名一致,且继承think\Controller:
```php
namespace app\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
return 'Hello, ThinkPHP 6.0!';
}
}
第三步:访问http://localhost:8000/,看到输出即表示控制器已生效。注意:方法名不能以_开头,否则框架视为私有方法不响应HTTP请求。
让视图渲染真正跑起来
方法一:使用内置模板引擎渲染HTML页面
在app/view目录下新建index/index.html,内容任意,例如<h1>{{ $name }}</h1>。
修改控制器中的index方法,返回视图而非字符串:
```php
public function index()
{
return view(['name' => 'TP6新手']);
}
方法二:指定模板路径渲染
若模板不在默认路径,可显式传入路径:
return view('user/profile', ['user' => $data]);
注意:view()函数默认查找app/view/控制器名/方法名.html,路径错误会抛出Think\Exception\TemplateNotFoundException异常。
数据库模型快速对接
① 在app/model目录下新建User.php:
```php
namespace app\model;
use think\Model;
class User extends Model
{
// 若实际表名为tp_users,需显式声明
// protected $table = 'tp_users';
}
② 确保config/database.php已填写host、username、password、database字段,否则User::select()会直接抛出PDOException。
③ 在控制器中调用模型必须用完整命名空间或use声明:
use app\model\User;
$user = User::find(1);
直接new User()会失败,因为模型类由容器统一管理。



















