ThinkPHP目录结构
参考
ThinkPHP3.2.3快速入门
ThinkPHP 新建控制器
结构简介
访问一个thinkphp结构网站的全部url是http://域名/index.php/模块名/控制器名/操作(即函数名)/参数
,
对应的文件结构示例如:
更详细的文件结构如下
主目录
www WEB部署目录(或者子目录)
├─index.php 入口文件
├─README.md README文件(说明,可删)
├─composer.json Composer定义文件(说明,可删)
├─Application 应用目录
├─Public 资源文件目录
├─ThinkPHP 框架(framework)目录
└─其他自定义目录
入口文件index.php
实例,根据实例我们可以看到,入口文件的作用就是整个ThinkPHP的主要配置
<?php
//省略了很多备注
// 检测PHP环境
if (version_compare(PHP_VERSION, '5.3.0', '<')) {
die('require PHP > 5.3.0 !');
}
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG', true);
// 设置目录安全文件
define('DIR_SECURE_FILENAME', 'April4U.html');
// 定义应用目录
define('APP_PATH', './Application/');
//默认模块
define('DEFAULT_MODULE','Home');
//主题目录
define('TMPL_PATH', './Theme/');
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
// 亲^_^ 后面不需要任何代码了 就是如此简单
应用/模块目录
由入口文件中的define('APP_PATH','./Application/');
参数决定
默认为Application
,示例
Application
├─Common 应用公共模块
│ ├─Common 应用公共函数目录
│ └─Conf 应用公共配置文件目录 //所有模块的公共配置目录,下面会详细说明
├─Home 默认生成的Home模块
│ ├─Conf 模块配置文件目录 //模块自身的配置目录,即该模块的控制器的公共配置目录
│ ├─Common 模块函数公共目录
│ ├─Controller 模块控制器目录
│ ├─Model 模块模型目录
│ └─View 模块视图文件目录
├─Runtime 运行时目录
│ ├─Cache 模版缓存目录
│ ├─Data 数据目录
│ ├─Logs 日志目录
│ └─Temp 缓存目录模块设计
├─admin 自己开发的模块目录等
│ ├─Conf 配置文件目录
│ ├─Common 公共函数目录
│ └─Controller 控制器目录
├─...更多自己开发的模块
默认模块
默认模块是Home
,可在入口文件中绑定
// 绑定入口文件到Admin模块访问
define('BIND_MODULE','Admin');
也可绑定运行目录
// 定义运行时目录
define('RUNTIME_PATH','./Runtime/');
运行目录需给 www-data
(ubuntu系统)或www
(centos系统)用户写入的权限
应用公共模块Common
示例目录结构
./Application/Common
├── Common
│ └── index.html
├── Conf
│ ├── config.php
│ └── index.html
└── index.html
./Application/Common
内含公共配置文件config.php
,类似于模块的全局配置,如在里面配置了数据库,则其他模块可以直接使用该配置
也可以在各自的./Application/模块名/Conf/config.php
里面配置,即为局部配置
模块内部结构
每一个模块又有类似下面的结构
├─模块目录
├─Conf 配置文件目录
├─Common 公共函数目录
├─Controller 控制器目录
├─Model 模型目录
├─Logic 逻辑目录(可选)
├─Service 服务目录(可选)
Conf
配置文件目录
每个应用模块都有独立的配置文件(位于模块目录的Conf/config.php
)
配置文件的定义格式支持PHP/JSON/YAML/INI/XML等方式,默认采用PHP数组定义
例如:刚下载的ThinkPHP3的./Application/Home/Conf/config.php
文件内容
<?php
return array(
//'配置项'=>'配置值'
);
PHP数组
arrary('key1'=>'value1','key2'=>'value2')
,添加配置项目,只要在数组内添加:'配置参数'=>'配置值'
配置值可以支持包括字符串、数字、布尔值和数组在内的数据
通常我们建议配置参数均使用大写定义。
也可使用其他类型的配置文件,略
控制器
每个模块都有控制器,在模块/Controller
文件夹内
控制器的作用:控制器是网站的入口,可以理解为生成网站的,ThinkPHP默认有一个入口,但是一般情况下一个网站拥有两个入口,如个人博客网站,一个前端入口供游客访问各个博客内容页面,一个后端入口,博客网站主人用来发布、修改、删除文章等,后端入口显然越隐蔽越好,还要加上身份验证,以防游客知道了胡乱对博客进行修改。
需要为每个控制器定义一个控制器类需要为每个控制器定义一个控制器类
类的命名格式xxxController.class.php
,其中xxx
为控制器的名字,并且首字母要大写
类中含有很多函数,不同的函数负责生成不同的页面等功能,如网站不同导航栏对应的内容对应不同的函数
例如刚安装的ThinkPHP的默认控制器/Application/Home/Controller/IndexController.class.php
,里面就有生成主页的函数index
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller
{
public function index()
{
$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p><br/>版
本 V{$Think.version}</div><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_55e75dfae343f5a1"></thinkad><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script>','utf-8');
}
}
我们也可以在里面添加其他的函数,使用url调用
一个正常的urlhttp://域名/index.php/模块名/控制器名/操作(即函数名)/参数
,不过设置了默认的模块,控制器名就省略很多部分不写,例如
我们直接访问入口文件http://域名/index.php
的话,由于URL中没有模块、控制器和操作,因此系统会访问默认模块(Home
)下面的默认控制器(Index
)的默认操作(index
),因此与http://域名/index.php/Home/Index/index/
的访问是等效的:
具体的url规则如下
URL规则
ThinkPHP采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从URL参数中解析当前请求的模块、控制器和操作,下面是一个标准的URL访问格式:
http://serverName/index.php/模块/控制器/操作
ThinkPHP支持的URL模式有四种:普通模式、PATHINFO、REWRITE和兼容模式。
1 普通模式
普通模式也就是使用传统的GET传参方式来指定当前访问的模块、控制器和操作,例如:
http://localhost/?m=home&c=index&a=hello&name=thinkphp
m参数表示模块,c表示控制器,a表示操作(即函数名)(当然,这些参数名是可以配置的),后面的表示其他GET参数。
默认值可以不传,因此下面的URL访问是和上面的等效:
http://localhost/?a=hello&name=thinkphp
2 PATHINFO模式
PATHINFO模式是系统的默认URL模式,提供了最好的SEO支持,系统内部已经做了环境的兼容处理,所以能够支持大多数的主机环境。
对应上面的URL模式,PATHINFO模式下面的URL访问地址是:
http://localhost/index.php/home/index/hello/name/thinkphp/
PATHINFO地址的前三个参数分别表示模块/控制器/操作(即函数名)/
,之后跟着操作(函数)的参数。
PATHINFO模式下面,也可以用普通模式的参数方式传入参数,例如:
http://localhost/index.php/home/index/hello?name=thinkphp
即/name/thinkphp/
等价于?name=thinkphp
PATHINFO模式下面,URL参数分隔符是可定制的,例如,通过下面的配置:
'URL_PATHINFO_DEPR'=>'-',// 更改PATHINFO参数分隔符
我们可以支持下面的URL访问:
http://localhost/index.php/home-index-hello-name-thinkphp
3 REWRITE模式
REWRITE模式是在PATHINFO模式的基础上添加了重写规则的支持,可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则。
如果是Apache则需要在入口文件的同级添加.htaccess
文件(注意linux里,.开头的文件是隐藏文件,用ls -all
查看),内容如下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
接下来就可以使用下面的URL地址访问了
http://localhost/home/index/hello/name/thinkphp/
4 兼容模式
兼容模式是用于不支持PATHINFO的特殊环境,URL地址是:
http://localhost/?s=/home/index/hello/name/thinkphp
兼容模式配合Web服务器重写规则的定义,可以达到和REWRITE模式一样的URL效果。
本文首发于我的博客@cndaqiang.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!