f10@t's blog

ThinkPHP框架学习---框架目录及框架配置

字数统计: 2.8k阅读时长: 11 min
2018/11/25

先从国产的方便学习的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
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
├─application           应用目录
│ ├─common 公共模块目录(可以更改)
│ ├─module_name 模块目录
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ └─ ... 更多类库目录
│ │
│ ├─command.php 命令行工具配置文件
│ ├─common.php 公共函数文件
│ ├─config.php 公共配置文件
│ ├─route.php 路由配置文件
│ ├─tags.php 应用行为扩展定义文件
│ └─database.php 数据库配置文件

├─public WEB目录(对外访问目录)
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写

├─thinkphp 框架系统目录
│ ├─lang 语言文件目录
│ ├─library 框架类库目录
│ │ ├─think Think类库包目录
│ │ └─traits 系统Trait目录
│ │
│ ├─tpl 系统模板目录
│ ├─base.php 基础定义文件
│ ├─console.php 控制台入口文件
│ ├─convention.php 框架惯例配置文件
│ ├─helper.php 助手函数文件
│ ├─phpunit.xml phpunit配置文件
│ └─start.php 框架入口文件

├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor 第三方类库目录(Composer依赖库)
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件
  ThinkPHP框架特点之一是,它是单一入口的框架,这样的好处是只需要对这一个入口进行安全监测即可。框架的入口就是publc目录,下面是public目录下的index.php文件内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// +----------------------------------------------------------------------
// | 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';
  我们可以看到在这个文件里,它定义了两个常量,'APP_PATH'是我们的应用路径、'CONF_PATH'是用于应用的配置文件,在该目录下我们可以根据需求来为应用进行配置。(ps:这个是我自己加的,我的版本是5.0.22_with_extends,好像删除了以前版本的conf目录,我还是觉得加上更好管理)   之后会加载框架的引导文件。下面是一个简单示例。   这是我的目录信息:         第一张是我的thinkphp目录,和默认的是一样的。第二张是我的app目录。   首先我设立了四个模块,分别是'admin','common','conf','index'。这四个模块使用的是MVC的设计模式,每个文件夹下都会有一个controller、view、model文件夹。可以简单理解为'index'是我的前端模块、admin是我的后端模块、common是公用模块、conf是我的配置模块(下一节会细说)。如何使用这个框架呢?在index文件夹下建立controller文件夹、建立Index.php文件,文件内容如下:
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace app\index\controller;

class Index
{
public function hello()
{
echo "Hello World!";
}
}
  打开服务器,进入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

<?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();
  步骤也很简单:加载基础文件、执行应用。我们来看看基础文件base.php的内容:
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

<?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);
  第14到33行我们可以看出它定义了各种常量,比如thinkphp的版本信息、目录分隔符、APP路径等等,这些都是thinkphp的默认配置。如果在conf目录下重新定义、或者在public下的index.php中定义(比如我们增添的路径),都会覆盖默认的配置。    ### 配置信息 #### 基本信息   这是我的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
2
3
4
5
6
7
8
9
10
11
12
13
<?php

namespace app\index\controller

class Index{

public function hello()
{
$res = Config::get();
dump($res);
}

}
  我们Config是ThinkPHP提供的一个类(我会单独总结),这里我们使用静态方法get()来打印当前的配置信息。      可以看到返回了一个数组,内容是我们的配置信息。    #### 配置方法   这里共有两种配置的方法:为所有模块配置、为单一模块配置。   写配置的方法也很简单。 ##### 为所有模块配置   在app目录下建立文件夹conf(名字固定),在其中建立文件cofig.php(名字固定),这要在这里写的配置信息都会被加载到app的所有模块。如:      这是没有配置前index模块下的Index类中的hello方法打印出来的index模块的配置,url为:http://localhost:8080/thinkphp/public/index/Index/hello。更改url,在其他模块中的结果也是一样的。现在,我们在conf目录下的config.php文件中写如下面内容:
1
2
3
4
5
<?php

return [
'author_name' => 'this is a test'
];
  刷新页面:      可以看到多出了这一条信息。其他模块中亦是如此。

为单一模块配置

  如果我们需要为指定模块做配置,只需要在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.php
  我为admin和index都建立了一个config.php配置信息文件。在admin下的config.php写入:
1
2
3
4
5
<?php

return [
'user_id' => 'adminUserId'
];
  在index下的config.php写入:
1
2
3
4
5
<?php

return [
'user_id' => 'indexUserId'
];
  分别访问两个模块,并打印配置信息:   http://localhost:8080/thinkphp/public/admin/Index/hello         http://localhost:8080/thinkphp/public/index/Index/hello         可以看到我们队两个模块分别进行了配置。

另外可以看到在conf目录下还有一个extra目录,这个目录使用来添加扩展配置的,范围可以是所有的模块,也可以是针对指定模块(建立在conf下的指定模块目录下)。

CATALOG
  1. 1. 关于ThinkPHP
  2. 2. 目录信息
    1. 2.0.1. 为单一模块配置