前言
最近在学习PHP的一个框架:ThinkPHP(下文简称TP),此文作为阶段性学习总结用,也希望对读者能有一些参考性的作用。文章主要重点为TP的配置方式的总结,同时对TP及框架作一个简单的介绍
一、关于框架与TP及其他
1.1. 框架
框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。
不同的框架基本都会遵循某种特定的设计模式,而本文中将探讨的TP框架应用的就是MVC的思想。遵循MVC模式的框架通常来说都由Model(模型层), View(视图层), Controller(控制器)三个层次组合而成。视图层相当于仪器面板,透过视图层用户对控制器进行操作(实际操作时由框架内的路由器根据用户操作分析URL并选择相应的控制器,向其传递相应的操作),控制器响应操作并选择模型层的相应模型进行运算,之后再通过控制器把结果反馈到视图层上。由于框架运行原理不是本文重点,故此处暂不作详细描述。
1.2.TP
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。遵循Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于ThinkPHP开发的应用开源或商业产品发布/销售。
1.3.TP5:本文中将要使用的TP版本,与前作(3.x版本)有较大不同
ThinkPHP5.0版本是一个颠覆和重构版本,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由、日志、异常、模型、数据库、模板引擎和验证等模块都已经重构,不适合原有3.2项目的升级,请慎重考虑商业项目升级,但绝对是新项目的首选(无论是WEB还是API开发)。
关于TP5的新特性请参阅TP5开发手册
二、TP5的安装环境及方法
2.1. TP5安装环境介绍
- PHP>=5.4.0
- PDO MbString CURL PHP Extension
- MySQL
- Apache或Nginx等web server服务
若想一键安装,安装wamp server即可 官网
以下操作均以安装wamp的情况为例
2.2. TP5的安装主要有三种方法:
- GitHub 安装
- Composer安装
- 官网直接下载安装
笔者采取的是第三种方法,私以为也是最适合新手懒人的方法。进入TP官网首页并点击上方的下载,进入下载页面后选择TP5下载即可。下载得到的是一个压缩包,将其解压至wamp安装目录下的www目录即可。解压出来的目录应该包含以下各项:
其中application文件夹是存放各个模块的目录,如前台使用的index模块及后台使用的admin模块(均可自己定义)等,public 通常设置为网站根目录,框架的入口文件就是放在这里。thinkphp 目录则是框架的源码目录,其中的library 目录为框架核心文件。由于大括号很难打,此处采用一张自己的笔记照片来表达其结构
用浏览器进入wamp根目录,找到thinkphp目录下的public目录并打开
如果见到浏览器页面变为
则安装成功
三、TP5的配置原理
重用性是每个框架都会重点考虑的特性,而为了达到框架的重用性,许多应用构筑时所必须的参数都不应与业务逻辑代码混合在一起,而应该单独存放,同时使用某种方式应用到相应的位置。以数据库配置为例,不但不同开发环境下会有不同的配置,相同开发环境下不同模块、开发的不同阶段、开发者的不同工作环境都有可能不同。那TP5的配置是怎样的呢?
TP5的配置从原理上可以大致分为两部分,一部分是配置文件,另一部分是读取部分。配置文件只需要返回一个多维数组,其中key为配置名,value为配置值。以数据库配置为例
<?php
return
[
'database' => [
// 数据库类型
'type' => 'mysql',
// 数据库连接DSN配置
'dsn' => '',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => '',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
]
?>
这就是一段数据库的配置,只需要返回一个数组即可。当应用的其他部分,例如模型层,打算连接数据库进行操作时,相应部分就会读取这个配置文件里的数组并将里面的值(如数据库密码等)填入相应的地方。这样就实现了配置和逻辑代码分开,充分发挥了重用性,便于维护与升级。而读取部分则一部分由\think\Config类内的方法实现,一部分由应用部分的代码实现。
四、配置的具体实现
4.1. 配置路径
框架默认的配置文件存放目录为应用目录(即application目录),但是为了维护方便我们往往会另外新建一个config目录。修改路径方法如下:
在public/index文件(框架的入口文件)中新增一行:
//定义配置路径
define('CONF_PATH', __DIR__.'/../conf/');
这样框架就会从根目录下的 conf 目录里读取配置文件了,以下操作均以该路径为例
4.2.查看配置的方法
当我们进入框架的首页的时候,其实是进入了框架里index模块的 index控制器的 index方法(因此框架首页也可以通过public/index/index/index
访问),而前文提到,application就是存放整个应用中的各种模块的地方。因此我们进入 application目录下的index目录, index目录下有个controller目录存放index模块的各种控制器,在里面找到 index.php 文件,修改里面index类的 index方法就可以改变首页显示内容了。想查看全部配置,只需要 dump(config());
即可。
4.3.配置类型
- 惯例配置:
惯例配置就是默认配置,配置文件位于thinkphp/convention.php
,如果你不需要作很大的配置改动,只需要改变这个文件里的值即可。 - 应用配置:
应用配置将作用于应用全局。在conf目录下新建一个config.php,在里面用前文提到的方法返回一个数组即可 - 模块配置:
在conf目录下新建以模块名为名的目录(例如index模块的话就在conf下新建一个index目录),并在该目录下新建config.php,在里面返回数组即可。该文件的设置将只应用在对应模块下。 - 场景配置:
当你在不同的工作环境,例如在公司和家里的时候,需要应用不同的配置(例如你可能会使用不同的数据库)时,就可以进行模块配置。在前文提到的应用配置文件里的数组里增加一项app_status,改变他的值就可以应用不同的配置文件。例如,当app_status的值设置为office时,框架就会自动读取配置目录(这里是conf目录)下的office.php里面的配置。 - 扩展配置:
这是TP5的新特性。如果你觉得conf里的配置项太多时,可以在conf下新建一个extra目录,里面的每一个文件的文件名都是一个配置项。例如,conf/extra/database.php里的配置相当于在config.php里的database项。同理你可以在各模块的配置目录里新建extra目录来达到类似效果。但是要注意的是,举例来说,当你在database.php里返回一个数组,里面是password等项,那么database项的配置会变成一个二维数组。 - 动态配置:
当你想在某种情况下实时配置某个配置项的时候,你可以在对应控制器的类里面写一个类构造函数,并在里面调用 config (key , value )方法。key是想改变/新增的配置项,value是配置项的值。当然,你也可以在控制器里的某个方法里面调用这个config方法来实现仅限于该方法的配置改变。 - Config类方法与助手函数:
Config类位于thinkphp/library/think/config.php
内,里面实现了框架的配置功能。当我们想主动调用时,可以像这样直接调用$res = \think\Config::get()
,也可以先use think\Config
,再直接调用get等方法。
而助手函数则是另外一种方便主动调用config类方法的途径。助手函数库位于thinkphp/helper.php,里面的函数可以直接在控制器内调用。对应如下表:
助手函数 | Config类 |
---|---|
config(key) | get(key) |
config(key,value) | set(key,value) |
config(key,value,range) | set(key,value,range) |
config(?key) | has(key) |
4.4. 配置优先级
惯例配置->应用配置->扩展配置->场景配置->模块配置->动态配置
后面的配置会覆盖前面的。但是要注意,覆盖时同一个配置项如果形式不一样就会报错。例如,当惯例配置的某配置是二维数组,而应用配置的该配置是三维数组,那就会报错。
结语及其他
以上为TP的基本配置方法,基本上可以应用大部分场景。但是除此以外,TP的配置还有很多其他方面的东西。比如说,配置一定要用数组吗?不一定。又比如说,配置的作用域该如何动态设定呢?这些都可以在TP的技术书册里找到答案。顺便一提,设置环境变量时可能出现dump显示不出来的情况,请参阅这里别问我怎么知道的【累觉不爱脸】
其他TP问题请期待后续文章如果有的话
如有谬误,欢迎捉虫
参考资料:TP的技术书册、慕课及度娘
(づ。◕‿‿◕。)づ