1
2
3
4
5
6
7
8
9
10
11
12
|
tp5
├─application 应用目录
├─extend 扩展类库目录(可定义)
├─
public
网站对外访问目录
├─runtime 运行时目录(可定义)
├─vendor 第三方类库目录(Composer)
├─thinkphp 框架核心目录
├─build.php 自动生成定义文件(参考)
├─composer.json Composer定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行工具入口
|
注意:
如果在linux环境下面的话,需要给runtime目录755权限。
有几个关键的路径先了解下:
目录 | 说明 | 常量 |
---|---|---|
tp5 | 项目根目录 | ROOT_PATH |
tp5/application | 应用目录 | APP_PATH |
tp5/thinkphp | 框架核心目录 | THINK_PATH |
tp5/exend | 应用扩展目录 | EXTEND_PATH |
tp5/vendor | Composer扩展目录 | VENDOR_PATH |
核心框架目录的结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
├─thinkphp 框架系统目录
│ ├─lang 语言包目录
│ ├─library 框架核心类库目录
│ │ ├─think think 类库包目录
│ │ └─traits 系统 traits 目录
│ ├─tpl 系统模板目录
│ │
│ ├─.htaccess 用于 apache 的重写
│ ├─.travis.yml CI 定义文件
│ ├─base.php 框架基础文件
│ ├─composer.json composer 定义文件
│ ├─console.php 控制台入口文件
│ ├─convention.php 惯例配置文件
│ ├─helper.php 助手函数文件(可选)
│ ├─LICENSE.txt 授权说明文件
│ ├─phpunit.xml 单元测试配置文件
│ ├─README.md README 文件
│ └─start.php 框架引导文件
|
运行环境
ThinkPHP5的环境要求如下:
- PHP >= 5.4.0 (完美支持PHP7)PDO PHP ExtensionMBstring PHP ExtensionCURL PHP Extension
在开始之前,你需要一个Web服务器和PHP5.4+运行环境,如果你暂时还没有,我们推荐使用集成开发环境WAMPServer(Windows系统下集成Apache、PHP和MySQL的服务套件)来使用ThinkPHP进行本地开发和测试,最新版本的WAMP在这里下载。
如果你不想安装任何WEB服务器,也可以直接使用PHP自带的WebServer,并且运行router.php来运行测试。
我们进入命令行,进入tp5/public目录后,输入如下命令:
1
|
php -S localhost:
8888
router.php
|
接下来可以直接访问
1
|
http:
//localhost:8888
|
注意: S 一定要大写,端口号可以随意设置,只要和已有的不冲突,如果要停止服务,直接在命令行下面按CTRL+C即可退出。
入口文件
ThinkPHP5.0版本的默认自带的入口文件位于public/index.php(实际部署的时候public目录为你的应用对外访问目录),入口文件内容如下:
1
2
3
4
|
// 定义应用目录
define(
'APP_PATH'
, __DIR__ .
'/../application/'
);
// 加载框架引导文件
require __DIR__ .
'/../thinkphp/start.php'
;
|
这段代码的作用就是定义应用目录APP_PATH和加载ThinkPHP框架的入口文件,这是所有基于ThinkPHP开发应用的第一步。
我们可以在浏览器中访问入口文件
1
|
http:
//localhost/tp5/public/
|
运行后我们会看到欢迎页面:
官方提供的默认应用的实际目录结构和说明如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
├─application 应用目录(可设置)
│ ├─index 模块目录(可更改)
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块公共文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ └─view 视图目录
│ │
│ ├─command.php 命令行工具配置文件
│ ├─common.php 应用公共文件
│ ├─config.php 应用配置文件
│ ├─tags.php 应用行为扩展定义文件
│ ├─database.php 数据库配置文件
│ └─route.php 路由配置文件
|
5.0版本采用模块化的设计架构,默认的应用目录下面只有一个index模块目录,如果我要添加新的模块可以使用控制台命令来生成。
切换到命令行模式下,进入到应用根目录并执行如下指令:
1
|
php think build --module demo
|
就会生成一个默认的demo模块,包括如下目录结构:
1
2
3
4
5
6
|
├─demo
│ ├─controller 控制器目录
│ ├─model 模型目录
│ ├─view 视图目录
│ ├─config.php 模块配置文件
│ └─common.php 模块公共文件
|
同时也会生成一个默认的Index控制器文件。
注意:这只是一个初始默认的目录结构,在实际的开发过程中可能需要创建更多的目录和文件。
在后面的示例中,为了方便访问,我们设置vhost访问,以apache为例的话定义如下:
1
2
3
4
|
<virtualhost :
80
=
""
>
DocumentRoot
"/home/www/tp5/public"
ServerName tp5.com
</virtualhost>
|
把DocumentRoot修改为你本机tp5/public所在目录,并注意修改本机的hosts文件把tp5.com指向本地127.0.0.1。
如果你暂时不想设置vhost或者还不是特别了解如何设置,可以先把入口文件移动到框架的ROOT_PATH目录,并更改入口文件中的APP_PATH和框架入口文件的位置(这里顺便展示下如何更改相关目录名称),index.php文件内容如下:
1
2
3
4
|
// 定义应用目录为apps
define(
'APP_PATH'
, __DIR__ .
'/apps/'
);
// 加载框架引导文件
require __DIR__ .
'/think/start.php'
;
|
这样最终的应用目录结构如下:
1
2
3
4
5
6
|
tp5
├─index.php 应用入口文件
├─apps 应用目录
├─
public
资源文件目录
├─runtime 运行时目录
└─think 框架目录
|
实际的访问URL变成了
1
|
http:
//localhost/tp5/
|
提示:
如非特别说明,我们后面的示例均以tp5.com进行访问,如果你使用了其它的方式请自行修改。
调试模式
ThinkPHP支持调试模式,默认情况下是开启状态。调试模式以除错方便优先,而且在异常的时候可以显示尽可能多的信息,所以对性能有一定的影响。
我们强烈建议开发者在使用ThinkPHP开发的过程中使用调试模式,5.0默认情况下可以捕获到任何细微的错误并抛出异常,这样可以更好的获取错误提示和避免一些问题和隐患。
开发完成后,我们实际进行项目部署的时候,修改应用配置文件(application/config.php)中的app_debug配置参数:
1
2
|
// 关闭调试模式
'app_debug'
=>
false
,
|
为了安全考虑,避免泄露你的服务器WEB目录信息等资料,一定记得正式部署的时候关闭调试模式。
控制器
我们找到index模块的Index控制器(文件位于application/index/controller/Index.php注意大小写),我们把Index控制器类的index方法修改为Hello,World!。
1
2
3
4
5
6
7
8
9
10
|
<!--?php
namespace app\index\controller;
class
Index
{
public
function index()
{
return
'Hello,World!'
;
}
}</pre-->
|
提示:
根据类的命名空间可以快速定位文件位置,在ThinkPHP5.0的规范里面,命名空间其实对应了文件的所在目录,app命名空间通常代表了文件的起始目录为application,而think命名空间则代表了文件的其实目录为thinkphp/library/think,后面的命名空间则表示从起始目录开始的子目录。
我们访问URL地址
1
|
http:
//tp5.com
|
就会看到Hello,World!的输出结果。
如果要继承一个公共的控制器类,可以使用:
123456789101112<!--?php
namespace app\index\controller;
use app\index\controller\Base;
class
Index
extends
Base
{
public
function index()
{
return
'Hello,World!'
;
}
}</pre-->
可以为操作方法定义参数,例如:
1
2
3
4
5
6
7
8
9
10
|
<!--?php
namespace app\index\controller;
class
Index
{
public
function index($name =
'World'
)
{
return
'Hello,'
. $name .
'!'
;
}
}</pre-->
|
当我们带name参数访问入口文件地址(例如http://tp5.com?name=ThinkPHP)的时候,在浏览器中可以看到如下输出:
Hello,ThinkPHP!
控制器类可以包括多个操作方法,但如果你的操作方法是protected或者private类型的话,是无法直接通过URL访问到该操作的,也就是说只有public类型的操作才是可以通过URL访问的。
我们来验证下,把Index控制器类的方法修改为:
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
|
<!--?php
namespace app\index\controller;
class
Index
{
public
function hello()
{
return
'hello,thinkphp!'
;
}
public
function test()
{
return
'这是一个测试方法!'
;
}
protected
function hello2()
{
return
'只是protected方法!'
;
}
private
function hello3()
{
return
'这是private方法!'
;
}
}</pre-->
|
当我们访问如下URL地址的时候,前面两个是正常访问,后面两个则会显示异常。
1
2
3
4
|
http:
//tp5.com/index.php/index/index/hello
http:
//tp5.com/index.php/index/index/test
http:
//tp5.com/index.php/index/index/hello2
http:
//tp5.com/index.php/index/index/hello3
|
当我们访问hello2和hello3操作方法后的结果都会显示类似的异常信息:
异常页面包含了详细的错误信息,是因为开启了调试模式,如果关闭调试模式的话,看到的默认信息如下:
视图
现在我们在给控制器添加视图文件功能,我们在application/index目录下面创建一个view目录,然后添加模板文件view/index/hello.html,我们添加模板内容如下:
1
|
|
要输出视图,必须在控制器方法中进行模板渲染输出操作,现在修改控制器类如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!--?php
namespace app\index\controller;
use think\Controller;
class
Index
extends
Controller
{
public
function hello($name =
'thinkphp'
)
{
$
this
--->assign(
'name'
, $name);
return
$
this
->fetch();
}
}
|
[ 新手须知 ]
这里使用了use来导入一个命名空间的类库,然后可以在当前文件中直接使用该别名而不需要使用完整的命名空间路径访问类库。也就说,如果没有使用
1use think\Controller;
就必须使用
1class
Index
extends
\think\Controller
这种完整命名空间方式。
在后面的内容中,如果我们直接调用系统的某个类的话,都会假设已经在类的开头使用use进行了别名导入。
注意,Index控制器类继承了think\Controller类之后,我们可以直接使用封装好的assign和fetch方法进行模板变量赋值和渲染输出。
fetch方法中我们没有指定任何模板,所以按照系统默认的规则(视图目录/控制器/操作方法)输出了view/index/hello.html模板文件。
接下来,我们在浏览器访问
1
|
http:
//tp5.com/index.php/index/index/hello
|
输出:
hello,thinkphp!
读取数据
在开始之前,我们首先在数据库demo中创建一个think_data数据表(这里以mysql数据库为例):
1
2
3
4
5
6
7
8
9
10
|
CREATE TABLE IF NOT EXISTS `think_data`(
`id`
int
(
8
) unsigned NOT NULL AUTO_INCREMENT,
`data` varchar(
255
) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
INSERT INTO `think_data`(`id`,`data`) VALUES
(
1
,
'thinkphp'
),
(
2
,
'php'
),
(
3
,
'framework'
);
|
首先我们需要在应用的数据库配置文件application/database.php中添加数据库的连接信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
return
[
// 数据库类型
'type'
=>
'mysql'
,
// 服务器地址
'hostname'
=>
'127.0.0.1'
,
// 数据库名
'database'
=>
'demo'
,
// 数据库用户名
'username'
=>
'root'
,
// 数据库密码
'password'
=>
''
,
// 数据库连接端口
'hostport'
=>
''
,
// 数据库连接参数
'params'
=> [],
// 数据库编码默认采用utf8
'charset'
=>
'utf8'
,
// 数据库表前缀
'prefix'
=>
'think_'
,
// 数据库调试模式
'debug'
=>
true
,
];
|
接下来,我们修改下控制器方法,添加读取数据的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!--?php
namespace app\index\controller;
use think\Controller;
use think\Db;
class
Index
extends
Controller
{
public
function index()
{
$data = Db::name(
'data'
)--->find();
$
this
->assign(
'result'
, $data);
return
$
this
->fetch();
}
}
|
定义好控制器后,我们修改模板文件,添加数据输出标签如下:
1
|
|
模板标签的用法和Smarty类似,就是用于输出数据的字段,这里就表示输出think_data表的id和data字段的值。
我们访问会输出:
1--thinkphp
总结
本章我们学习了如何安装ThinkPHP和框架的目录结构,如何创建项目的入口文件和开启调试模式,并通过一个Hello,Name例子说明了如何定义控制器和模板,以及如何读取数据库的数据并在模板渲染输出。