PHP交流群:294088839,
Python交流群:652376983
一.什么是框架
ThinkPHP
网站地址:www.thinkphp.cn
1.框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题。
一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、
协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,
它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。
框架的关键还在于框架内对象间的交互模式和控制流模式。
2.为什么要用框架
因为软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及到的知识,内容,问题太多。
在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,
你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题。
3.软件为什么要分层?
为了实现“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源
4.常见的框架
php有TP(ThinkPHP)、Laravel 、Yii、CI、ZendFramework
二.ThinkPHP框架的认识和应用
1.认识ThinkPHP框架的入口文件index.php
ThinkPHP框架必须要求PHP版本在5.3以上
index.php文件中这两个配置可以进行修改:
// 开启调试模式 建议开发阶段开启 上线部署阶段注释或者设为false
define('APP_DEBUG',True);
// 定义应用目录 所写的项目的文件都在此目录中,
//根据自己的需求可以对此目录名进行修改
define('APP_PATH','./Application/');
把他自带的Application文件夹删除然后重新运行一下入口文件就自动生成对应的新的文件夹
如果你还需要别的模块比如后台模块、手机端模块、要自己在你自己网站总文件夹下添加,
每个模块都是独立存在的,如果不需要哪个就直接删除,或者禁用就行了
生成的文件夹目录:
Application下自动生成三个文件夹
Common 应用公共模块
Home 默认生成Home模块 主要放置前端页面
Runtime 运行时目录 放置些临时数据
Common下自动生成两个文件夹
Common 应用公共函数目录
Conf 应用公共配置文件目录
Home下自动生成五个文件夹
Conf 模板配置文件 配置文件
Common 模块函数公共目录 公共文件
Controller 模板控制器目录 控制器文件
Model 模板模型目录 数据库文件
View 模块视图文件目录 放页面文件
Runtime 运行目录
Cache 模板缓存目录 静态文件缓存
Data 数据目录 字段缓存
Logs 日志目录
Temp 缓存目录 临时数据缓存文件
如果后期网站做了一些更新,而没有更新,建议可以把Runtime文件删除他会自动生成新的文件夹
//引入TP的核心文件
require './ThinkPHP/ThinkPHP.php';
2.自动生成网站文件夹中都有一个index.html页面这个文件是一个安全文件
上线之后在apache下设置默认文档(一般在250行),当有人向访问你网站的其中一个文件夹中的路径时,他会自动执行这个
默认文档,从而保护了网站的目录结构
这个index.html安全文件不一定都叫这个名字,可以根据自己的喜好来改这个安全文件名
用DIR_SECURE_FILENAME这个常量来进行修改,修改的这个文件名一定要跟apache下的设置默认文档一样
例:define('DIR_SECURE_FILENAME','default.html')
如果感觉自己的网站安全性比较高,也可以关闭这个安全文件,一般不建议关掉
define('BUILD_DIR_SECURE',false);
也可以在安全文件中写一些内容,作为提醒
define('DIR_SECURE_CONTENT','看什么看');
3.控制器文件(大小写严格区分)
控制器类的命名方式:控制器名(驼峰法,首字母大写)+Controller
控制器文件的命名方式:类名+class.php(类文件后缀)
控制器文件中的代码有三个部分:
1)命名空间 防止类名冲突
例:namespace Home\Controller;
2)导入类文件
使用命名空间:
相对文件名形式如foo.txt。它会被解析为 currentdirectory/foo.txt,
其中 currentdirectory 表示当前目录。因此如果当前目录是 /home/foo,
则该文件名被解析为/home/foo/foo.txt
例:use Think\Controller; Think同一空间下的Controller类
3)继承导入进来的控制器基础类
例:class IndexController extends Controller {
public function index(){
$this->show('看什么看')
}
}
$this->show()跟echo差不多都是打印东西 建议在这个框架下使用$this->show();
使用这个框架,他有默认控制器和默认方法,当你什么都不传的时候他会自动执行这个控制器中的方法
如果你添加了控制器和方法就需要通过url传值才能得到相对应的方法
所有的访问控制器和方法都需要通过入口文件来进行传值,TP框架入口文件index.php
url路径传值有两种传值方式:
通过问号进行传值c传的是控制器,a传的是控制器中对应的方法
例:http://localhost/yhshop/index.php?c=Index&a=test
通过/进行传值 /访问的模块/访问的选择器/访问的选择器中的方法 这种传值方式是TP框架默认的传值方式
例:http://localhost/yhshop/index.php/Home/index/test
这样的写法更有利于优化网络爬虫更喜欢爬这样方式
如果对方法中传值的话 /访问的模块/访问的选择器/访问的选择器中的方法/变量名/值
例:http://localhost/yhshop/index.php/Home/index/test/id/5
//添加方法
public function test(){
$this->show('这是一个新增页面'.$_GET['id']);
}
4.TP框架的命名规范
类文件都要以.class.php为后缀,使用驼峰法命名,并将首字母大写
类的命名空间地址和所在的路径一致,
确保文件的命名和调用大小一致,是由于Unix系统上面,对大小写是敏感的
类名和文件名一致(大小写一致), 控制器下后面跟上Controller模型下后面跟上Model
函数的命名方式采用下划线的命名方式 函数就是没有命名类
方法使用小驼峰方式 方法是类文件中的方法
如果是私有方法,方面名前加一个下划线
属性命名使用小驼峰,私有属性命名前面加一个下划线
以双下划线开始的是魔术方法
常量以大写字母和下滑线命名
配置文件都以.php结尾
配置参数以大写字母和下划线命名(不区分大小写)但是一般还是按规则写
模板文件名一般是以.html为后缀(可以通过配置修改)
重点:数据表和字段采用小写加下划线方式来命名,注意字段名不要以下划线开头,例:user_name;
三.TP框架的配置
ThinkPHP文件夹下的Conf文件夹下的convention.php是TP框架的默认配置,所有的TP框架的默认配置都在这个文件夹中
如果这个常量没有的话直接退出,安全的配置
defined('THINK_PATH') or exit();
例:默认的模块是Home 默认的控制器是Index 默认的方法是index
1)配置加载
一般来说应用配置文件是自动加载的,加载顺序:(优先级:越到最后越高)
默认配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置->动态配置
默认配置位于ThinkPHP/Conf/convention.php
应用配置位于Application/Common/Conf/config.php
如果想对默认配置中的东西进行修改,就在应用配置中添加
读取应用配置中的值可以通过大C方法进行读取配置中的值
C('参数名称')
例:C('DEFAULT_CHARSET')
模式配置(可选)
如果使用了普通应用模式之外的应用模式的话,还可以为应用模式(后面会有描述)单独定义配置文件,
文件命名规范是: Application/Common/Conf/config_应用模式名称.php (仅在运行该模式下面才会加载)。
调试配置(可选)位于ThinkPHP/Conf/debug.php
状态配置(可选)
每个应用都可以在不同的情况下设置自己的状态(或者称之为应用场景),并且加载不同的配置文件
例:需要在公司和家里分别设置不同的数据库测试环境
在公司环境中,我们在入口文件中定义:define('APP_STATUS','office');
那么就会自动加载该状态对应的配置文件(位于 Application/Common/Conf/office.php )。
如果我们回家后,我们修改定义为:define('APP_STATUS','home');
那么就会自动加载该状态对应的配置文件(位于 Application/Common/Conf/home.php )。
模块配置位于 Application/当前模块名/Conf/config.php
如果在Application下的Common/Common/Conf/config.php配置应用配置他会对所有模块都生效
而你只想配置其中一个模块中的应用配置就可以在Application/当前模块名/Conf/config.php目录下
对当前模块的应用配置进行添加
扩展配置
可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样
设置扩展配置的方式:
// 加载扩展配置文件
'LOAD_EXT_CONFIG' => 'db',
如果哪个模块需要扩展配置就在Application下的Common/Conf/建一个扩展配置文件
然后在Application下的Common/Common/Conf/config.php文件加载'LOAD_EXT_CONFIG' => 'db',扩展配置
在Application下的Common/Conf/下建扩展配置会对所有模块都生效,如果向对其中一个模块进行扩展配置
就在那个模块下的Common/Conf/下建扩展配置,然后在应用配置config.php下加载这个文件就行了
动态配置
具体的操作方法里面,我们仍然可以对某些参数进行动态配置(或者增加新的配置),主要是指那些还没有被使用的参数
设置格式:
C('参数名称','新的参数值')
四.模块化设计
1.如果我们需要生成一个Admin模块用于后台应用:
define('BIND_MODULE','Admin');可以用这个常量生成一个模块,但是生成以后他的
默认访问控制器就是Admin中的方法,把默认的Home文件给覆盖了,所以一般我们如果用这个方法生成了后台文件夹以后
就把这个方法给关掉,这样他默认的访问就还是Home里的控制器了
2.如果我们要生成多个类文件可以用这个常量,后面参数跟的是你分别生成的类文件名
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
这个常量中间那个字母(CONTROLLER)对应的是你要生成在哪个目录下
当所有的模块都存在的时候这些文件是不会生成的,所以是在开始使用框架的时候来生成这些需要的文件夹和类文件
在对项目结构比较熟悉的情况下在生成文件夹的时候把控制器器和模块模型目录(Model)所用的类文件直接生成
如果你是手动建一个模块,把一个原有的模块复制一份修改名字而生成的记得要把类文件中的命名空间改对应
3.设置禁止访问的模块列表
在应用配置中配置 'MODULE_DENY_LIST' => array('Common','Runtime','Api'),
4.设置访问列表
'MODULE_ALLOW_LIST' => array('Home','Admin','User')
5.多入口设计
可以给相同的应用及模块设置多个入口,不同的入口文件可以设置不同的应用模式或者绑定模块。
我们搭建网站的时候,用户访问前端页面,管理员访问后台页面,这时候我们需要有多个入口访问
相对应的模块
例:我们在 index.php 文件的同级目录新增一个 admin.php 入口文件,并绑定Admin模块:
// 绑定Home模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
五.URL路径
1.ThinkPHP框架的URL是区分大小写(主要是针对模块、控制器和操作名,不包括应用参数)的,这一点非常关键,
因为ThinkPHP的命名规范是采用驼峰法(首字母大写)的规则,而URL中的模块和控制器都是对应的文件,
因此在Linux环境下面必然存在区分大小写的问题
框架内置了一个配置参数用于解决URL大小写的问题:'URL_CASE_INSENSITIVE' => true写进应用配置文件,可以不区分大小写
但是有的时候这个常量有时候不太好用,在实际开发中Linux还是会区分大小写,建议平时开发中还是把大小写写清楚
2.URL模式
URL模式就是系统默认的PATHINFO模式,不同的URL模式获取模块和操作的方法不同,
ThinkPHP支持的URL模式有四种:普通模式、PATHINFO、REWRITE和兼容模式
可以设置URL_MODEL参数改变URL模式:
0 普通模式 用?传值
例:localhost/yhshop/index.php?c=Index&a=test
1 PATHINFO模式 用/传值
例:localhost/yhshop/index.php/Home/index/test
2 REWRITE模式 重写模式
可以省去index.php这样的入口文件,可以隐藏自己的网站是什么语言开发的
3 兼容模式
当不支持以上的模式可以用这个兼容模式
1)普通模式:普通模式也就是传统的GET传参方式来指定当前访问的模块和操作
例如: http://localhost/?m=home&c=user&a=login&var=value
m参数表示模块,c参数表示控制器,a参数表示操作(当然这些参数都是可以配置的),后面的表示其他GET参数
这些参数可以通过方法进行修改,但是不建议进行修改
2)PATHINFO模式
PATHINFO模式是系统的默认URL模式,提供了最好的SEO支持,
系统内部已经做了环境的兼容处理,所以能够支持大多数的主机环境。+
访问模式:例:
http://localhost/index.php/home/user/login/var/value/
这种模式下index.php入口文件名不能省去
PATHINFO模式下面,URL是可定制的后面的传值/可以进行修改
// 在应用配置文件添加PATHINFO参数分隔符
'URL_PATHINFO_DEPR'=>'-',
3)REWRITE模式 重写功能(伪静态)
如果你真想把这个入口文件名省去可以使用REWRITE模式 重写模式
想实现重写模式需要开启Apache的重写功能
根据不同的服务器环境来开启不同的重写功能
首先要在框架中入口文件的同级添加.htaccess文件(一般默认都有)
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
然后进入Apache中的主配置文件找到里的重写模块
LoadModule rewrite_module modules/mod_rewrite.so开启这个配置文件
然后允许网站的根目录进行重写
Options FollowSymLinks
AllowOverride All(把这里的None改成All)
Order allow,deny
Allow from all
然后再把下面的目录中
AllowOverride All(把这里的None改成All)
然后重启Apache
4)兼容模式
兼容模式是用于不支持PATHINFO的特殊环境
URL地址是: http://localhost/?s=/home/user/login/var/value
通过大U()方法可以自动生成url路径在什么模式下生成什么样子的路径
例:
//自动生成Url路径
public function test2(){
$this->show(U("Index/test2/id/100"));
}
页面显示:/2017.6.27.ThinkPHP/yhshop/index.php/Index/test2/id/100.html
TP框架默认模式是1 PATHINFO模式 所以会生成这样的路径,如果你把模式改成别的会
生成对应的路径 如果你的配置文件配合好了 Apache下也配好了
建议把模式改成2 REWRITE模式 重写模式 这样可以实现伪静态,对自己的路径进行处理
让别人看不懂你的路径 这样可以保护你的网站
对于命名空间的设计可以见TP框架中的构架目录中命名空间的介绍