先从国产的方便学习的ThinkPHP框架开始学起,stay hungry, stay foolish.
关于ThinkPHP
ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进。 [1]
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,ThinkPHP框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。
作为一个整体开发解决方案,ThinkPHP能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。
摘自百度百科。
目录信息
框架就的作用就像一个毛坯房,他提供了各种房间:卧室、客厅、厨房、厕所等等,也提供了各类方法:电线插板、空调线口、下水道等等。充分了解一个框架有助于我们去更好的工作。下面我们来看看ThinkPHP的框架目录信息以及各自的作用。
这是官方文档给出的目录信息:
1 | ├─application 应用目录 |
ThinkPHP框架特点之一是,它是单一入口的框架,这样的好处是只需要对这一个入口进行安全监测即可。框架的入口就是publc目录,下面是public目录下的index.php文件内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// [ 应用入口文件 ]
// 定义应用目录
define('APP_PATH', __DIR__ . '/../app/');
// 定义配置文件目录
define('CONF_PATH',__DIR__ . '/../app/conf/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
之后会加载框架的引导文件,下面是一个简单示例。这是我的目录信息:
第一张是我的thinkphp目录,和默认的是一样的。第二张是我的app目录。
首先我设立了四个模块,分别是'admin', 'common', 'conf', 'index'
。这四个模块使用的是MVC的设计模式,每个文件夹下都会有一个controller、view、model文件夹。可以简单理解为'index'是我的前端模块、admin是我的后端模块、common是公用模块、conf是我的配置模块(下一节会细说)。
如何使用这个框架呢?在index文件夹下建立controller文件夹、建立Index.php文件,文件内容如下:
1 |
|
打开服务器,进入localhost下的public目录就会看到:
URL也能看出我访问的是public下的index模块的Index类的hello方法,输出正常。这就是一个示例了。
当然我再添加方法也可以,只需改变URL后的内容即可,如我新建了world方法,URL为http://localhost:8080/thinkphp/public/index/Index/world
即可。
同理,访问不同的模块方法亦是如此,如访问我建好的admin模块,同样改变URL即可,如:http://localhost:8080/thinkphp/public/admin/xxx/xxx
基础信息
在public目录下的index.php我们可以看到引用了thinkphp下的框架引导文件:start.php。我们看一下源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21\thinkphp\start.php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace think;
// ThinkPHP 引导文件
// 1. 加载基础文件
require __DIR__ . '/base.php';
// 2. 执行应用
App::run()->send();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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67\thinkphp\base.php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
define('THINK_VERSION', '5.0.22');
define('THINK_START_TIME', microtime(true));
define('THINK_START_MEM', memory_get_usage());
define('EXT', '.php');
define('DS', DIRECTORY_SEPARATOR);
defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);
define('LIB_PATH', THINK_PATH . 'library' . DS);
define('CORE_PATH', LIB_PATH . 'think' . DS);
define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);
defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS);
defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS);
defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS);
defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS);
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);
defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS);
defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS);
defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目录
defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀
defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀
// 环境常量
define('IS_CLI', PHP_SAPI == 'cli' ? true : false);
define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);
// 载入Loader类
require CORE_PATH . 'Loader.php';
// 加载环境变量配置文件
if (is_file(ROOT_PATH . '.env')) {
$env = parse_ini_file(ROOT_PATH . '.env', true);
foreach ($env as $key => $val) {
$name = ENV_PREFIX . strtoupper($key);
if (is_array($val)) {
foreach ($val as $k => $v) {
$item = $name . '_' . strtoupper($k);
putenv("$item=$v");
}
} else {
putenv("$name=$val");
}
}
}
// 注册自动加载
\think\Loader::register();
// 注册错误和异常处理机制
\think\Error::register();
// 加载惯例配置文件
\think\Config::set(include THINK_PATH . 'convention' . EXT);
这是我的app目录下的结构: 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│ .htaccess
│ command.php
│ common.php
│ config.php
│ database.php
│ route.php
│ tags.php
│
├─admin
│ └─controller
│ Index.php
│
├─common
│ └─controller
│ Index.php
│ User.php
│
├─conf
│ │ config.php
│ │
│ ├─admin
│ │ config.php
│ │
│ ├─extra
│ │ demo.php
│ │ emails.php
│ │
│ └─index
│ config.php
│
└─index
└─controller
Index.php
User.php
其中admin、index、common、conf。四个文件夹是我建立的,前三者是单独作用的模块,common模块为公用模块。此外可以看到有一个config.php文件,这个文件是对app的通用配置,一般我们不进行更改。
我们在index模块下的Index.php中添加方法:
1 |
|
我们Config是ThinkPHP提供的一个类(我会单独总结ThinkPHP框架学习---config类和config助手函数),这里我们使用静态方法get()来打印当前的配置信息。
可以看到返回了一个数组,内容是我们的配置信息。
配置方法
这里共有两种配置的方法:为所有模块配置、为单一模块配置。写配置的方法也很简单。
为所有模块配置
在app目录下建立文件夹conf(名字固定),在其中建立文件cofig.php(名字固定),这要在这里写的配置信息都会被加载到app的所有模块。如:
这是没有配置前index模块下的Index类中的hello方法打印出来的index模块的配置,url为:http://localhost:8080/thinkphp/public/index/Index/hello
。更改url,在其他模块中的结果也是一样的。现在,我们在conf目录下的config.php文件中写如下面内容:
1 |
|
刷新页面:
可以看到多出了这一条信息。其他模块中亦是如此。
为单一模块配置
如果我们需要为指定模块做配置,只需要在conf目录下建立与模块名字相同的目录,下面增加config.php文件,在里面写我们的配置即可。这是我的conf目录:
1
2
3
4
5
6
7
8
9
10
11
12─conf
│ │ config.php
│ │
│ ├─admin
│ │ config.php
│ │
│ ├─extra
│ │ demo.php
│ │ emails.php
│ │
│ └─index
│ config.php1
2
3
4
5
return [
'user_id' => 'adminUserId'
];1
2
3
4
5
return [
'user_id' => 'indexUserId'
];
http://localhost:8080/thinkphp/public/admin/Index/hello
http://localhost:8080/thinkphp/public/index/Index/hello
可以看到我们对两个模块分别进行了配置。另外可以看到在conf目录下还有一个extra目录,这个目录使用来添加扩展配置的,范围可以是所有的模块,也可以是针对指定模块(建立在conf下的指定模块目录下)。