【PHP】关于TP5框架与Vue前后端分离开发的探索
手上带的一个项目,后端用的是PHP的TP5框架。
去年对其因为了解不够深入,开发时没用成前后端分离的模式,踩了很多坑。前后端不分离意味着:
- 不能使用Webpack对Vue页面进行打包压缩和混淆,安全性和开发效率都大大降低。
- 负责前端的同学得和负责PHP的同学在同一个HTML上操作,你编辑的时候TA就不能写,TA编辑的时候你就不能写。不然你俩各自写完先后保存,前一个保存的人写的代码会被覆盖,那不大冤种吗。
所以今年探索了一下TP5框架如何在宝塔面板进行配置,使之能访问Vue单页面应用。
TP5目录结构
先来了解下TP5框架的目录结构,方便对其大致有个了解。
一共有6个重要目录:
application
:应用目录,用户大部分代码都写在这个里边public
:对外可访问web目录config
:框架配置目录,每个文件对应着一级配置runtime
:运行目录,存放临时生成的缓存文件或编译脚本文件route
:路由目录,存放用户自定义的路由定义thinkphp
:框架核心目录(尽可能不要修改,以方便框架升级)
两个其他目录:
extend
:扩展类库目录,用来存放不便归类模块和扩展框架功能vender
:由Composer加载并管理的第三类库目录
1 | //站点文件夹 |
应用目录介绍
TP5学习的重点是框架的MVC设计模式,将全部在
application
应用目录中体现。我们几乎全部的代码都写在了应用目录对应模块中:- common:公共模块目录,存放被其它模块所共享的代码,外部禁止URL访问
- module:模块目录,可以有多个例如index,admin
application
应用目录细节如下,对于每一个模块,我们最关心的是model
、view
、controller
目录,即MVC架构:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17|--index //index模块
| |--controller //控制器类库目录
| | |--Index.php //Index控制器类
| | |--User.php //User控制器类
| |--model //模型类库目录
| | |--User.php //User模型类,通常对应user数据表
| | |--Goods.php //Goods模型类,通常对应goods数据表
| |--view //视图目录
| | |--index //index目录通常对应着Index控制器
| | | |--index.php //与Index控制器类中的index操作对应
| | |--user //user目录通常对应着 User 控制器
| | | |--add.php //与User控制器类中的add操作对应
| |--config //模块配置目录(可选)
| |--common.php //模块公共函数库(可选)
|
|--config //应用配置目录(可选)
|--common.php //应用公共函数库(可选)
在宝塔面板部署
1. 站点初始化
添加站点,创建数据库,选择PHP版本
域名解析就省略不说了,别忘了解析后访问一下通不通
2. TP5框架初始化
找个TP5空框架上传到网站目录
打开站点设置,将网站目录中的运行目录从
/
修改为/public
。因为这是TP5对外可访问web目录,将来这里放前端Vue打包的文件,修改后浏览器通过域名直接可以访问到这里的index.html
前端页面修改
application
应用目录下的database.php
数据库配置文件,添上数据库名称、用户名和密码
3. 创建Web页面
在TP5对外提供访问的web目录
public
下创建一个index.html
页面1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<html>
<head>
<meta charset="utf-8">
<title>12345</title>
<style>
.container {
width: 60%;
margin: 10% auto 0;
background-color: #f0f0f0;
padding: 2% 5%;
border-radius: 10px
}
ul {
padding-left: 20px;
}
ul li {
line-height: 2.3
}
a {
color: #20a53a
}
</style>
</head>
<body>
<div class="container">
<h1>Hello!</h1>
<h3>此页面是TP5框架public文件夹下的index.html</h3>
</div>
</body>
</html>通过域名
http://网站域名.com/
打开站点,正常的话就能看到该页面了
将来前端写好Vue页面后,将打包出来的
index.html
页面,以及其他资源文件夹如css
、js
、img
、fonts
等前端的东西,统统放进public
目录下即可。换句话说,整个public可以看做分给前端的地盘,存放页面和静态资源。
那如果前端不是用Vue写的单页面应用,除了index.html
之外还有其他页面目录,那怎么访问?那不简单嘛,按正常目录结构呗,我整理了一下几种情况(当然真实开发肯定不这么写,仅用来演示访问的几种情况):
1 | //TP5对外访问的web目录 |
重定义应用入口路径
在我接手的之前的旧项目中,我发现页面其实并没有写到/public
下,而是写到了/application/index/view/
中,目录结构大致如下:
1 | //TP5应用目录 |
究其原因,我发现/public
中有两个PHP文件,一个是index.php
,另一个是router.php
,应该是它俩的作用效果。
定义到application
我们已经知道,TP5之前的外部访问入口路径是/public
,那现在打开站点设置,查看默认文档:
1 | index.php |
会发现站点的默认入口文件里index.php
的优先级高于index.html
,这就意味着如果在TP5的对外访问目录public
下同时存在index.php
和index.html
两个文件,网站会选择听index.php
的而不是index.html
的。(你现在知道谁是老大了吼!这个index.html就是逊啦!)
现在我们在public
下创建如下index.php
:
1 |
|
可以看到它重新定义了对外访问的应用目录,从原来的/public
修改为了/../application/
也就是说,你通过http://网站域名.com
访问站点的话,它先根据站点配置文件去/public
找。一看里面同时存在index.php
和index.html
两个文件,它会只听前者的。再继续,index.php
让它去找TP5框架application应用目录,于是它就会去找application目录下index模块的view视图目录,如果在里面有index/index.html
,它就显示出来,如果没有,它就会报错:模板文件不存在:/www/wwwroot/网站域名.com/public/../application/index/view/index/index.html
那要是按如上修改了,怎么访问其他页面?
那就把/application
index模块的视图层view
当成根目录呗,依旧很简单,我整理一下(假如有index和login两个页面):
1 | //TP5应用目录 |
然后旧项目中/public
目录下的router.php
我没看懂是干什么的,我知道是路由,但删掉也没见影响页面显示:
1 |
|
定义到站点根目录
在搜相关知识的过程中,发现还能将TP5的首页定位到根目录下。但其实没必要,下方内容不看也罢。
将public目录下的index.php移动到根目录。
将index.php文件内容进行修改。
- 修改前
1
2
3
4// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php'; - 修改后(每行删了一个英文点)
1
2
3
4// 定义应用目录
define('APP_PATH', __DIR__ . '/./application/');
// 加载框架引导文件
require __DIR__ . '/./thinkphp/start.php';
- 修改前
将public目录下的
.htaccess
移动到根目录,这个是Apache用户配置文件(伪静态)修改public目录下的
router.php
文件- 修改前
1
2
3
4
5
6
7
8if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) {
return false;
} else {
if (!isset($_SERVER['PATH_INFO'])) {
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
}
require __DIR__ . "/index.php";
} - 修改后(最后一行加了一个英文点)
1
2
3
4
5
6
7
8if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) {
return false;
} else {
if (!isset($_SERVER['PATH_INFO'])) {
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
}
require __DIR__ .. "/index.php";
}
- 修改前
修改后就可以通过类似
http://网站域名.com/admin
访问页面了,由于html在/application
里,访问静态资源需要在资源文件路径前添加/public/
参考内容:
[1] 司文秦瘦. tp5目录结构. CSDN博客. 2019.
[2] GP_宣泄笔记. TP5目录结构. CSDN博客. 2018.
[2] tp5将首页定位到根目录下的解决方法