PHP之 ThinkPHP5.0框架的使用

简介:

1.1 php适合快速开发Web接口,其语法的简单和开发的速度拥有不少使用者,之前一度抢占编程语言前5。随着快速发展,也出现不少优秀框架,比较著名的有ThinkPHP,Laravel,Yii。

1.2 框架选择

  • ThinkPHP易上手,国内开发文档丰富,社区活跃;但目录结构不太整洁,深入不叫困难,适合中小型项目。
  • Laravel结构清晰,功能齐全,工具丰富,社区强大,但入门困难;文件较多,相对臃肿。适合中大型项目。
  • Yii OOP设计思想,使用方便,开发速度快,性能强大,功能丰富;大多英文文档,学习成本大,对技术要求高。适合中大型项目。

二,ThinkPHP5.0目录

2.1 Thinkphp5.0相对比较成熟稳定,官方地址:https://www.thinkphp.cn/down/framework.html

如果上面地址不行,用自动下载地址:https://www.thinkphp.cn/donate/download/id/870.html

2.2 跟目录说明

project  应用部署目录
├─composer.json         composer定义文件
├─README.md             README文件
├─build.php             自动生成定义文件(参考)
├─LICENSE.txt           授权说明文件
├─application           应用目录(可设置)
│  ├─common             公共模块目录(可更改)
│  ├─runtime            应用的运行时目录(可写,可设置)
│  ├─module             模块目录
│  │  ├─config.php      模块配置文件
│  │  ├─common.php      模块函数文件
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  ├─ ...            更多类库目录
│  ├─common.php         公共函数文件
│  ├─route.php          路由配置文件
│  ├─database.php       数据库配置文件
│  └─config.php         公共配置文件
├─public                WEB部署目录(对外访问目录)
│  ├─index.php          应用入口文件
│  ├─.htaccess          用于apache的重写
│  └─router.php         快速测试文件(用于自带webserver)
├─thinkphp              框架系统目录
│  ├─library            框架类库目录
│  │  ├─behavior        行为类库目录
│  │  ├─think           Think类库包目录
│  │  ├─org             Org类库包目录
│  │  ├─traits          系统Traits目录
│  │  ├─ ...            更多类库目录
│  ├─extend             扩展类库目录(可自定义)
│  ├─vendor             第三方类库目录
│  ├─mode               应用模式目录
│  ├─tpl                系统模板目录
│  ├─base.php           基础文件
│  ├─convention.php     框架惯例配置文件
│  └─start.php          框架引导文件

 2.3 将下载的thinkphp放到网站根目录访问,浏览器输入http://localhost/tp5/public/ 

3874d1433911bbe0fbc3e75d5a32a778.png

2.3 访问路径 

默认路径:http://localhost/tp5/public/

完整路径:​​​​​​http://localhost/tp5/public/index.php/index/index/index

上面看起来很多index,比较乱,我们可以另外自己写个控制器来清晰认识下

http://localhost/tp5/public/index.php/amodule/bcontroller/caction/id/1

[请求协议http]+[域名]+[tp目录]+[web入口public]+[入口文件]+[模块名]+[控制器]+[操作]+[参数]+[参数名]+[参数]+[参数名]...

2.4 简化访问路径,批量注册

原路径:http://localhost/tp5/public/index.php/amodule/bcontroller/caction/id/1

第一步,去掉public

将 public 里的 index.php 移动到根目录,修改对应的应用目录和引导文件

原文件:/../ 表示回退到上级目录,这里index.php的上级目录是tp跟目录

<?php
// [ 应用入口文件 ]

 // 定义应用目录
 define('APP_PATH', __DIR__ . '/../application/');
 // 加载框架引导文件
 require __DIR__ . '/../thinkphp/start.php';

修改后文件,__DIR__表示当前文件的所在的位置,这里即index.php所在目录

<?php
// [ 应用入口文件 ]

// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';

第二步 配置 httpd.conf,搜索全部 AllowOverride none 改为 AllowOverride ALL

<Directory "D:/server/apache/cgi-bin">
    AllowOverride none  改为   AllowOverride ALL
    Options None
    Order allow,deny
    Allow from all
</Directory>

第三步 配置.htaccess

 在根目录创建.htaccess文件,如果别的地方有,可以拷贝过来

<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On
 
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]
</IfModule>

到这步访问路径是这样的 http://localhost/tp5/amodule/bcontroller/caction 

第四步 利用路由去掉模块和控制器

在tp5 -> application -> route.php里面增加路由

<?php
return [
    '__pattern__' => [
        'name' => '\w+',
    ],
    '[hello]'     => [
        ':id'   => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
        ':name' => ['index/hello', ['method' => 'post']],
    ],
    '[test]'     => [
        'new'   => ['amodule/bcontroller/caction', ['method' => 'get']],
    ],
];

这样访问的路径就会缩短为 http://localhost/tp5/test/new

或者这样修改

<?php
return [
    '__pattern__' => [
        'name' => '\w+',
    ],
    '[hello]'     => [
        ':id'   => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
        ':name' => ['index/hello', ['method' => 'post']],
    ],
    'new/[:name]' => 'amodule/bcontroller/caction',
];

访问的路径就会变为 http://localhost/tp5/new

2.5 第二种简化路径方法 Route::rule

静态路由:

<?php
// return [
//     '__pattern__' => [
//         'name' => '\w+',
//     ],
//     '[hello]'     => [
//         ':id'   => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
//         ':name' => ['index/hello', ['method' => 'post']],
//     ],
//     // '[test]'     => [
//     //     'new'   => ['amodule/bcontroller/caction', ['method' => 'get']],
//     // ],
//     // 'new/[:name]' => 'amodule/bcontroller/caction',
// ];

//引用路由模块
use think\Route;
//注册路由到amodule模块的bcontroller控制器的caction操作
//静态路由
Route::rule('new', 'amodule/bcontroller/caction','GET');

 访问路径会变为 http://localhost/tp5/new

注意:

必须去掉动态注册路由的部分

必须添加引用use think\Route;

 动态路由:

<?php
// return [
//     '__pattern__' => [
//         'name' => '\w+',
//     ],
//     '[hello]'     => [
//         ':id'   => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
//         ':name' => ['index/hello', ['method' => 'post']],
//     ],
//     // '[test]'     => [
//     //     'new'   => ['amodule/bcontroller/caction', ['method' => 'get']],
//     // ],
//     // 'new/[:name]' => 'amodule/bcontroller/caction',
// ];

//引用路由模块
use think\Route;
//注册路由到amodule模块的bcontroller控制器的caction操作
//静态路由册
Route::rule('new', 'amodule/bcontroller/caction','GET');
//动态路由册
Route::rule('test/:id','amodule/bcontroller/daction','GET');

 访问路径会变为 http://localhost/tp5/new     http://localhost/tp5/test/1

或者直接指定GET类型,不用引用think\Route

<?php
// return [
//     '__pattern__' => [
//         'name' => '\w+',
//     ],
//     '[hello]'     => [
//         ':id'   => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
//         ':name' => ['index/hello', ['method' => 'post']],
//     ],
//     // '[test]'     => [
//     //     'new'   => ['amodule/bcontroller/caction', ['method' => 'get']],
//     // ],
//     // 'new/[:name]' => 'amodule/bcontroller/caction',
// ];

//引用路由模块
// use think\Route;
// //注册路由到amodule模块的bcontroller控制器的caction操作
// //静态路由册
// Route::rule('new', 'amodule/bcontroller/caction','GET');
// //动态路由册
// Route::rule('test/:id','amodule/bcontroller/daction','GET');


\think\Route::get('new','amodule/bcontroller/caction');
\think\Route::get('test/:id','amodule/bcontroller/daction');

 访问路径会变为 http://localhost/tp5/new     http://localhost/tp5/test/1

 2.5 第三种简化路径方法,绑定Route::bind

// //绑定到模块/控制器/操作
// 绑定当前的URL到 amodule模块
Route::bind('amodule');
// 绑定当前的URL到 amodule模块的bcontroller控制器
Route::bind('amodule/bcontroller');

 访问路径会变为 http://localhost/tp5/caction

当然也能绑定其它目录,比如控制器,命名空间,类等等 

三 ThinkPHP5.0配置

3.1 入口文件

1e87d999a3b74105acf2b12dae09e634.png

 3.2 应用配置

5d3641764f37458a9bae340197ecabc1.png

3.3 数据库配置

83e24e1bfe7e43d9bafef61faea1a48d.png

 3.4 访问域名配置

e71c7652be8c4699a2ea1f114d77eaf9.png

 四,系统架构

4.1 ThinkPHP5.0在没有启用路由的情况下典型的URL访问规则是:

http://serverName/应用(或应用入口文件)/模块/控制器/操作/[参数名/参数值...]

4.2 支持切换到命令行访问,如果切换到命令行模式下面的访问规则是:

>php.exe index.php(应用入口文件) 模块/控制器/操作/[参数名/参数值...]

4.3 无论是URL访问还是命令行访问,都采用PATHINFO模式的访问地址,其中PATHINFO的分隔符是可以设置的。

4.4 thinkphp5取消了URL模式的概念,普通模式的URL访问不再支持,如果不支持PATHINFO的服务器可以使用兼容模式访问如下:

http://serverName/应用入口文件?s=/模块/控制器/操作/[参数名/参数值...]

4.5 简化URL访问,隐藏应用入口文件

1、httpd.conf配置文件中加载了mod_rewrite.so模块
2、AllowOverride None 将None改为 All
3、把下面的内容保存为.htaccess文件放到应用入口文件的同级目录下

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

4.6 隐藏模块

由于默认是采用多模块的支持,所以多个模块的情况下必须在URL地址中标识当前模块,如果只有一个模块的话,可以进行模块绑定,方法是应用的公共文件中添加如下代码:

// 绑定index模块
\think\Route::bind('module','index');

设置后,我们的URL访问地址则变成:

http://serverName/应用入口/控制器/操作/[参数名/参数值...] // 访问的模块是index模块

4.7 隐藏控制器

如果你的应用比较简单,模块和控制器都只有一个,那么可以在应用公共文件中绑定模块和控制器,如下:

// 绑定index模块的index控制器
\think\Route::bind('module','index/index');

设置后,我们的URL访问地址则变成:

http://serverName/应用入口/操作/[参数名/参数值...] // 访问的模块是index模块,控制器是Index控制器

五 路由

ada18fdc6c9d48efb005b009494c444d.png

5.1 ThinkPHP5.0默认采用的URL规则是:

http://server/module/controller/action/param/value/...

5.2 普通模式,关闭路由,完全使用默认的pathinfo方式URL:

'url_route_on'  =>  false

路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL:

module/controller/action/param/value/...

5.3 混合模式,开启路由,并使用路由+默认PATH_INFO方式的混合:

'url_route_on'  =>  true

5.4 注册路由,动态注册

使用Route类的register方法注册路由规则(通常可以在应用的公共文件中注册,或者定义配置文件后在公共文件中批量导入的方式注册),例如注册如下路由规则后:

\think\Route::register('new/:id','index/New/read');

我们访问:

http://serverName/new/5

ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。

其实是访问的:

http://serverName/index/new/read/id/5

六,控制器 

6.1 ThinkPHP引入了分层控制器的概念,通过URL访问的控制器为访问控制器层(Controller)或者主控制器,访问控制器是由\think\App类负责调用和实例化的,无需手动实例化。

6.2 URL解析和路由后,会把当前的URL地址解析到 [ 模块/控制器/操作 ],其实也就是执行某个控制器类的某个操作方法,下面是一个示例:

namespace app\index\controller;
class New 
{
    public function index(){
        return 'index';
    }
    public function add(){
        return 'add';
    }
    public function edit($id){
        return 'edit:'.$id;
    }
}

6.3 当前定义的主控制器位于index模块下面,所以当访问不同的URL地址的页面输出如下:

http://serverName/index/new/index // 输出 index
http://serverName/index/new/add     // 输出 add
http://serverName/index/new/edit/id/5 // 输出 edit:5

七 视图 

7.1 视图功能由Think\View类和模板引擎(驱动)类一起完成

实例化视图类

// 实例化视图类
$view = new \think\View();
 // 渲染模板输出
return $view->fetch();

7.2 如果你的控制器继承了\think\Controller类的话,则可以直接使用

 // 渲染模板输出
return $this->fetch();

需要注意的是,ThinkPHP5的视图fetch方法不会直接渲染输出,只是返回解析后的内容。如果在控制器类返回 视图解析内容的话,渲染输出系统会自动调用think\Response类的send方法进行渲染输出。

八,数据库

e01a192e84d342d8b7387eb3cf283ed0.png

8.1 全局配置定义

常用的配置方式是在公共配置文件或者模块配置文件中添加下面的配置参数:

'database'=> [
    // 数据库类型
    'type'        => 'mysql',
    // 数据库连接DSN配置
    'dsn'         => '',
    // 服务器地址
    'hostname'    => '127.0.0.1',
    // 数据库名
    'database'    => 'thinkphp',
    // 数据库用户名
    'username'    => 'root',
    // 数据库密码
    'password'    => '',
    // 数据库连接端口
    'hostport'    => '',
    // 数据库连接参数
    'params'      => [],
    // 数据库编码默认采用utf8
    'charset'     => 'utf8',
    // 数据库表前缀
    'prefix'      => 'think_',
    // 数据库调试模式
    'debug'       => true,
    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    'deploy'      => 0,
    // 数据库读写是否分离 主从式有效
    'rw_separate' => false,
    // 读写分离后 主服务器数量
    'master_num'  => 1,
    // 指定从服务器序号
    'slave_no'    => '',
];

8.2 也支持独立数据库配置文件定义的方式,例如在 application/database.php文件中定义如下:

return [
    // 数据库类型
    'type'        => 'mysql',
    // 数据库连接DSN配置
    'dsn'         => '',
    // 服务器地址
    'hostname'    => '127.0.0.1',
    // 数据库名
    'database'    => 'thinkphp',
    // 数据库用户名
    'username'    => 'root',
    // 数据库密码
    'password'    => '',
    // 数据库连接端口
    'hostport'    => '',
    // 数据库连接参数
    'params'      => [],
    // 数据库编码默认采用utf8
    'charset'     => 'utf8',
    // 数据库表前缀
    'prefix'      => 'think_',
    // 数据库调试模式
    'debug'       => false,
    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    'deploy'      => 0,
    // 数据库读写是否分离 主从式有效
    'rw_separate' => false,
    // 读写分离后 主服务器数量
    'master_num'  => 1,
    // 指定从服务器序号
    'slave_no'    => '',
];

8.3 也可以支持简化的DSN数据库连接字符串写法(支持大部分的连接参数),例如:

'database'=> 'mysql://root:[email protected]:3306/thinkphp#utf8'

如果需要的话,可以对每个模块定义不同的数据库连接信息,只需要在模块配置文件中添加database设置参数即可。

8.4 连接参数

可以针对不同的连接需要添加数据库的连接参数,例如:

如果需要使用长连接,可以采用下面的方式定义:

'params' => [PDO::ATTR_PERSISTENT => true],

九 输入,变量获取 

9.1 获取GET变量

\think\Input::get('id'); // 获取某个get变量
\think\Input::get('name'); // 获取get变量
\think\Input::get(); // 获取所有的get变量(数组)

或者使用内置的快捷I方法实现相同的功能:

9.2 获取POST变量

\think\Input::post('name'); // 获取某个post变量
\think\Input::post(); // 获取全部的post变量

使用快捷方法实现:

I('post.name');
I('post.');

9.3 获取PUT变量

\think\Input::put('name'); // 获取某个put变量
\think\Input::put(); // 获取全部的put变量

使用快捷方法实现:

I('put.name');
I('put.');

9.4 获取PARAM变量

PARAM变量是框架提供的用于自动识别GET、POST或者PUT请求的一种变量获取方式,例如:

\think\Input::param('name');
如果当前是get请求,那么等效于
\think\Input::get('name');
如果当前是post请求,则等同于
\think\Input::post('name');

使用快捷方法实现:

I('param.name');
I('param.');
或者
I('name');
I('');

因为I函数默认就采用PARAM变量读取方式。

9.5 获取REQUEST变量

\think\Input::request('id'); // 获取某个request变量
\think\Input::request(); // 获取全部的request变量

使用快捷方法实现:

9.6 获取SERVER变量

\think\Input::server('PHP_SELF'); // 获取某个server变量
\think\Input::server(); // 获取全部的server变量

使用快捷方法实现:

I('server.PHP_SELF');
I('server.');

9.7 获取SESSION变量

\think\Input::session('user_id'); // 获取某个session变量
\think\Input::session(); // 获取全部的session变量

使用快捷方法实现:

I('session.user_id');
I('session.');

9.8 获取Cookie变量

\think\Input::cookie('user_id'); // 获取某个cookie变量
\think\Input::cookie(); // 获取全部的cookie变量

使用快捷方法实现:

I('cookie.user_id');
I('cookie.');

9.9 变量过滤

支持对获取的变量进行过滤,过滤方式包括函数、方法过滤,以及PHP内置的Types of filters,例如:

\think\Input::get('name','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤
\think\Input::param('username','strip_tags'); // 获取param变量 并用strip_tags函数过滤
\think\Input::post('name','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤

可以支持传入多个过滤规则,例如:

\think\Input::param('username','strip_tags,strtolower'); // 获取param变量 并依次调用strip_tags、strtolower函数过滤

Input类还支持PHP内置提供的Filter ID过滤,例如:

\think\Input::post('email',FILTER_VALIDATE_EMAIL);

框架对FilterID做了转换支持,因此也可以使用字符串的方式,例如:

\think\Input::post('email','email');

采用字符串方式定义FilterID的时候,系统会自动进行一次filter_id调用转换成Filter常量。

具体的字符串根据filter_list函数的返回值来定义。

需要注意的是,采用Filter ID 进行过滤的话,如果不符合过滤要求的话 会返回false,因此你需要配合默认值来确保最终的值符合你的规范。

例如,

\think\Input::post('email',FILTER_VALIDATE_EMAIL,'');

就表示,如果不是规范的email地址的话 返回空字符串。

9.10 变量修饰符

I函数支持对变量使用修饰符功能,可以更好的过滤变量。

用法如下: 
I('变量类型.变量名/修饰符');
或者
\think\Input::get('变量名/修饰符');

例如:

I('get.id/d');
I('post.name/s');
I('post.ids/a');
\think\Input::get('id/d');

ThinkPHP5.0版本默认的变量修饰符是/s,如果需要传入字符串之外的变量可以使用下面的修饰符,包括:

修饰符 作用
s 强制转换为字符串类型
d 强制转换为整形类型
b 强制转换为布尔类型
a 强制转换为数组类型
f 强制转换为浮点类型

如果你要获取的数据为数组,请一定注意要加上 /a 修饰符才能正确获取到。

猜你喜欢

转载自blog.csdn.net/qq_29848853/article/details/129645184