项目目录结构
www WEB部署目录(或者子目录)
├─index.php 入口文件
├─README.md README文件
├─composer.json Composer定义文件
├─Application 应用目录
├─Public 资源文件目录
└─ThinkPHP 框架目录
ThinkPHP目录结构
├─ThinkPHP 框架系统目录(可以部署在非web目录下面)
│ ├─Common 核心公共函数目录
│ ├─Conf 核心配置目录
│ ├─Lang 核心语言包目录
│ ├─Library 框架类库目录
│ │ ├─Think 核心Think类库包目录
│ │ ├─Behavior 行为类库目录
│ │ ├─Org Org类库包目录
│ │ ├─Vendor 第三方类库目录
│ │ ├─ ... 更多类库目录
│ ├─Mode 框架应用模式目录
│ ├─Tpl 系统模板目录
│ ├─LICENSE.txt 框架授权协议文件
│ ├─logo.png 框架LOGO文件
│ ├─README.txt 框架README文件
│ └─index.php 框架入口文件
项目目录结构部
项目名称
├─Common 应用公共模块
│ ├─Common 应用公共函数目录
│ └─Conf 应用公共配置文件目录
├─Home 默认生成的Home模块
│ ├─Conf 模块配置文件目录
│ ├─Common 模块函数公共目录
│ ├─Controller 模块控制器目录
│ ├─Model 模块模型目录
│ └─View 模块视图文件目录
├─Runtime 运行时目录
│ ├─Cache 模版缓存目录
│ ├─Data 数据目录
│ ├─Logs 日志目录
│ └─Temp 缓存目录模块设计
模块化的目录结构
Application 默认应用目录(可以设置)
├─Common 公共模块(不能直接访问)
├─Home 前台模块
├─Admin 后台模块
├─... 其他更多模块
├─Runtime 默认运行时目录(可以设置)每个模块是相对独立的,其目录结构如下:
├─Module 模块目录
│ ├─Conf 配置文件目录
│ ├─Common 公共函数目录
│ ├─Controller 控制器目录
│ ├─Model 模型目录
│ ├─Logic 逻辑目录(可选)
│ ├─Service 服务目录(可选)
│ ... 更多分层目录可选
│ └─View 视图目录
增加新模块:只需要在入口文件index.php文件中增加定义就可以。例如:生成Admin模块
define('APP_PATH','./Application/');
// 绑定入口文件到Admin模块访问
define('BIND_MODULE','Admin');
require './ThinkPHP/ThinkPHP.php'
Admin模块不存在,所以会在第一次访问时创建该模块。
PS:新建模块创建成功后 要删除创建语句,不然再访问模块时 会报 找不到控制器的错误异常
开启调试模式
define('APP_DEBUG', true); // 开启调试模式 false关闭调试模式
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
配置
每个模块都有独立的配置文件,Conf/config.php
控制器
每个控制器对应一个控制器类,命名规范:
控制器名+Controller.class.php(模块名采用驼峰式 且 首字母大写)
系统默认的控制器是Index,对应的模块目录下Controller/IndexController.class.php,类名与文件名一致,默认操作是public 的 index方法。如果设置为private,protected 无法通过URL访问
参数访问
URL:http://localhost/index.php/home/index/hello/name/baby
name为key baby为value
URL访问home模块下的index控制器的hello方法并传参nama=baby
key 名必须与 方法的接收参数名一致
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function hello($name='thinkphp'){
echo 'hello,'.$name.'!';
}
}
URL 请求
ThinkPHP单一入口模式访问应用,所有请求应都指向应用的入口文件,系统会根据参数解析当前请求的模块->控制器->操作。
例:localhost/index.php/模块/控制器/操作 如果访问不存在的模块控制器操作,系统会默认访问home下的默认Index控制器的默认Index方法。
URL四冲模式:普通模式,PATHINFO,REWRITE和兼容模式。
1.普通模式 传统GET传参来访问指定模块
http://localhost/?m=home&c=index&a=hello&name=thinkphp
m:模块 c:控制器 a:方法 name:参数名 thinkphp参数值
2.PATHINFO
系统默认的就是该URL模式,提供了最好的SEO支持,环境兼容处理。
http://localhost/index.php/home/index/hello/name/thinkphp/
PATHINFO地址的前三个参数分别是模块/控制器/操作
传参:
http://localhost/index.php/home/index/hello?name=thinkphp
PATHINFO的分隔符配置:更改PATHINFO的URL分隔符
'URL_PATHINFO-DEPR'=>'-'
改后:
http://localhost/index.php/home-index-hello-name-thinkphp
3.REWRIT
在PATHINFO上增加的URL重写,去掉了URL中的index.php入口文件,但需要配置web服务器重写规则。
apache 在index.php入口文件同级目录下增加.htaccess文件 内容:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
增加后去除index.php
http://localhost/home/index/hello/name/thinkphp/
- 兼容模式
兼容模式用于不支持PATHINFO的特殊环境
兼容模式配合Web服务器重写规则的定义,可以达到和REWRITE模式一样的URL效果。
http://localhost/?s=/home/index/hello/name/thinkphp
视图
ThinkPHP内置编译模板引擎,支持PHP模板,也包括了Smarty在内的模板驱动。ThinkPHP在渲染模板时如不指定模板,则会用系统默认的定位规则。定义规范:模块目录下的View/控制器名/操作名.html 。Home模块的hello操作的默认模板位于home模块目录下
模板文件
<html>
<head>
<title>hello {$name}</title>
</head>
<body>
hello, {$name}!
</body>
</html>
控制器渲染模板
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function hello($name='thinkphp'){
//渲染参数
$this->assign('name',$name);
//此处可指定任何模板 未指定则按照系统规则调用默认的模板文件
$this->display();
}
}
PS:默认模板 需要根据模块创建 模块名文件夹 再创建模板文件 不然会报找不到模板文件错误
数据库
模块/Conf/config.php 配置数据信息
'DB_TYPE'=>'mysql',// 数据库类型
'DB_HOST'=>'127.0.0.1',// 服务器地址
'DB_NAME'=>'magiex',// 数据库名
'DB_USER'=>'root',// 用户名
'DB_PWD'=>'',// 密码
'DB_PORT'=>3306,// 端口
'DB_PREFIX'=>'fn_',// 数据库表前缀
'DB_CHARSET'=>'utf8',// 数据库字符集
读取数据
/* * 如果指定了数据库前缀,在调用时会自动拼接 前缀+数据库表名 * M('user') 指的是表名 */ public function getData(){ $DB=M('user'); $result=$DB->find(1); $this->assign('result',$result); $this->display('hello'); }
M函数是think内置的实例化模型方法。不需要创建对应的模型类,直接操作读取数据库。而model类则内置了基本的CRUD方法
模板获取数据
<html>
<head>
<title></title>
</head>
<body>
hello, {$result.password}!
</body>
</html>
总结实践中的错误:
1. 新建模块创建成功后 要删除创建语句,不然再访问模块时 会报 找不到控制器的错误异常
2. 默认模板 需要根据模块创建 模块名文件夹 再创建模板文件 不然会报找不到模板文件错误