代码拉取完成,页面将自动刷新
版本:5.1.*
主要新特性
- 引入容器和facade支持
- 依赖注入
- 重构的对象化路由
- 支持注解路由
- 跨域请求支持
- 配置和路由目录独立
- 取消系统常量
- 助手函数增强
- 类库别名机制
- 模型和数据库增强
- 验证类增强
- 模板引擎改进
- 支持PSR-3日志规范
- 中间件支持
- 支持 swoole / workerman 运行
thinkphp5.1环境要求
- php >= 5.6
- pdo extension
- MBstring extension
composer 安装
登录composer镜像官网查看具体版本号
composer create-project topthink/think=5.1.49 tp5
git 安装
命名规范
目录和文件
- 目录使用小写 + 下划线
- 类库和函数文件统计使用.php为后缀
- 类的文件名均以命名空间定义,并且命名空间路径和类库文件所在路径一致
- 类文件采用驼峰法命名(首字母大写),其他文件采用小写+下划线命名
- 类名和文件名保持一致,类名采用驼峰法
函数和类、属性命名
- 类的命名采用驼峰法(首字母大写),默认不添加后缀。如UserTypeController直接命名UserType
- 函数命名采用小写字母加下划线(小写字母开头)。例如get_content_type
- 方法的命名采用驼峰法(首字母小写)。例如getUserName
- 属性的命名采用驼峰法(首字母小写)。例如tableName
- 魔术方法采用双下划线开头。例如__autoload
常量和配置
- 常量以大写字母和下划线命名。例如APP_PATH
- 配置参数以小写字母和下划线命名。例如url_route_on
- 环境变量定义使用大写字母和下划线。例如APP_DEBUG
数据表和字段
- 数据表和字段采用小写和下划线方式命名,并注意字段名不能以下划线开头。例如think_user表和user_name字段
www WEB部署目录(或者子目录)
├─application 应用目录
│ ├─common 公共模块目录(可以创建、删除)
│ ├─module_name 模块目录(index/admin/api)
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─config 配置目录
│ │ └─ ... 更多类库目录
│ │
│ ├─command.php 命令行定义文件
│ ├─common.php 公共函数文件
│ └─tags.php 应用行为扩展定义文件
│
├─config 应用配置目录
│ ├─module_name 模块配置目录(index/admin/api)
│ │ ├─database.php 数据库配置
│ │ ├─cache 缓存配置
│ │ └─ ...
│ │
│ ├─app.php 应用配置
│ ├─cache.php 缓存配置
│ ├─cookie.php Cookie配置
│ ├─database.php 数据库配置
│ ├─log.php 日志配置
│ ├─session.php Session配置
│ ├─template.php 模板引擎配置
│ └─trace.php Trace配置
│
├─route 路由定义目录
│ ├─route.php 路由定义
│ └─... 更多
│
├─public WEB目录(对外访问目录)
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│
├─thinkphp 框架系统目录
│ ├─lang 语言文件目录
│ ├─library 框架类库目录
│ │ ├─think Think类库包目录
│ │ └─traits 系统Trait目录
│ │
│ ├─tpl 系统模板目录
│ ├─base.php 基础定义文件
│ ├─convention.php 框架惯例配置文件
│ ├─helper.php 助手函数文件
│ └─logo.png 框架LOGO文件
│
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor 第三方类库目录(Composer依赖库)
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件
http://serverName/index.php/模块/控制器/操作/参数/值
// 错误的用法
$class = new stdClass();
$xml = new SimpleXmlElement($xmlstr);
// 正确的用法
$class = new \stdClass();
$xml = new \SimpleXmlElement($xmlstr);
名称 | 描述 | 类库目录 |
---|---|---|
think | 系统核心类库 | thinkphp/library/think |
traits | 系统Traits类库 | thinkphp/library/traits |
app | 应用类库 | application |
├─route 路由定义目录
│ ├─route.php 路由定义
│ ├─api.php 路由定义
│ └─... 更多路由定义
最基本的定义路由的方法
Route::rule('路由表达式','路由地址','请求类型');
// 注册路由到index模块的News控制器的read操作
Route::rule('new/:id','index/News/read');
//我们访问 http://serverName/new/5 会自动路由到
http://serverName/index/News/redad/id5
//指定请求类型
Route::rule('new/:id','News/update','POST');
//指定多种请求类型
Route::rule('new/:id','News/read','GET|POST');
reastful api请求类型
类型 | 描述 | 快捷方法 |
---|---|---|
GET | get | |
POST | post | |
PUT | put | |
DELETE | delete | |
PATCH | patch | |
* | any |
快速注册路由方法:
Route::快捷方法名('路由表达式','路由地址');
Route::get('new/:id','News/read'); // 定义GET请求路由规则
Route::post('new/:id','News/update'); // 定义POST请求路由规则
Route::put('new/:id','News/update'); // 定义PUT请求路由规则
Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
注册多个路由规则后,系统会一次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则则后续规则不在检测
Route::rule('/', 'index'); // 首页访问路由
Route::rule('my', 'Member/myinfo'); // 静态地址路由
Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合
Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合
Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址
Route::get('blog/:year/[:month]','Blog/archive');
//变量由[]包裹起来,表示该变量是由路由匹配的可选变量
//下面的url地址都可以被正确的路由匹配
http://serverName/index.php/blog/2015
http://serverName/index.php/blog/2015/12
//可选参数只能放到路由规则的最后,如果在中间使用了可选参数的话,后面的变量都会变成可选参数。
Route::get('new/:cate$', 'News/category');
//成功
http://serverName/index.php/new/info
//失败
http://serverName/index.php/new/info/2
//两个URL都能成功
Route::get('new/:cate', 'News/category');
//如果需要全局进行URL完全匹配,可以在app.php中设置
'route_complete_match' => true,
Route::get('blog/:id','blog/read?status=1&app_id=5');
//上面的路由规则定义中额外参数的传值方式都是等效的。status和app_id参数都是URL里面不存在的,属于隐式传值,当然并不一定需要用到,只是在需要的时候可以使用。
// 注册路由到index模块的News控制器的read操作
Route::name('new_read')->rule('new/:id','index/News/read');
//生成路由的时候可以使用
url('new_read',['id'=>10]);
//如果不定义路由标识的话,可以通过下面生成
url('index/News/read',['id'=>10]);
//第一个列子,要修改一下
// 注册路由到index模块的News控制器的read操作
Route::rule('new/:id','index/News/read')->name('new_read');
//支持在规则路由中为变量用正则的方式指定规则
'default_route_pattern' => '[\w\-]+',
// 定义GET请求路由规则 并设置name变量规则
Route::get('new/:name', 'News/read')
->pattern(['name' => '\w+']);
//不需要开头添加^或者在最后添加$,也不支持模式修饰符,系统会自动添加。
// 设置name变量规则(采用正则定义)
Route::pattern('name', '\w+');
// 支持批量添加
Route::pattern([
'name' => '\w+',
'id' => '\d+',
]);
Route::get('item-<name>-<id>', 'product/detail')
->pattern(['name' => '\w+', 'id' => '\d+']);
//可以把路由规则中的变量传入路由地址中,就可以实现一个动态路由
//后面部分是路由地址
Route::get('hello/:name', 'index/:name/hello');
定义方式 | 定义格式 |
---|---|
1.路由->模块控制器 | '[模块/控制器/操作]?参数1=值1&参数2=值2' |
2.路由->重定向地址 | '外部地址(默认301重定向)' 或 ['外部地址','重定向代码'] |
3.路由->控制器的方法 | '@[模块/控制器]操作' |
4.路由->类的方法 | '\完整的命名空间类::静态方法' 和 '\完整的命名空间类@动态方法' |
5.路由->闭包函数 | 闭包函数定义 |
6.路由->Response对象 | Response对象定义和设置 |
7.路由->模板文件 | view 方法 |
// 路由到默认或者绑定模块
//如果默认绑定的是index模块,那这里就不用写index,真实路由地址index/blog/read
Route::get('blog/:id','blog/read');
// 路由到index模块
Route::get('blog/:id','index/blog/read');
//路由地址中支持多级控制器,真实路由地址 index/controller/group/Blog 这里group可以是文件夹名,实际中很实用
Route::get('blog/:id','index/group.blog/read');
//还可以支持路由到动态的模块、控制器、操作,例如:
// action变量的值作为操作方法传入
Route::get(':action/blog/:id', 'index/blog/:action');
// 变量传入index模块的控制器和操作方法
Route::get(':c/:a', 'index/:c/:a');
//定义如下路由,相当于直接调用\app\index\blog类的read方法
Route::get('blog/:id','@index/blog/read');
//通常在这种方法下面,由于没有定义当前模块、控制器、方法名,从而导致视图的默认模板失效,所以如果使用了视图模板渲染,则必须传入明确的参数而不能为空id
//执行的是\app\index\service\Blog类的read方法
Route::get('blog/:id','\app\index\service\Blog@read');
Route::get('blog/:id','\app\index\service\Blog::read');
Route::get('blog/:id','/blog/read/id/:id');
Route::get('blog/:id','blog/read');
//这两种方式 都是路由到同一个地址,但前者采用的是301重定向的方式路由跳转,这种方式的好处是URL可以比较随意(里面可以传递更多非标准参数),而后者只是支持模块和操作地址。例如:我们希望avatar/123重定向到/member/avatar/id/123,只能使用
Route::get('avatar/:id','/member/avatar/id/:id');
//路由地址采用重定向的话,如果要引用动态变量,直接使用动态变量即可
//采用重定向到外部地址通常对网站改版后的URL迁移过程非常有用
Route::get('blog/:id','http://blog.thinkphp.cn/read/:id');
//表示当前网站(可能是http://thinkphp.cn )的 blog/123地址会直接重定向到 http://blog.thinkphp.cn/read/123。
//5.1.3版本之后,可以使用redirect方法注册一个重定向路由
Route::redirect('blog/:id','http://blog.thinkphp.cn/read/:id',302);
//表示该路由会渲染到index模块下view/hello.html模板文件输出
Route::view('hello/:name','index@hello');
//模板文件中可以直接输出当前请求的param变量,如果需要增加额外的模板变量,可以使用
Route::view('hello/:name','index@hello',['city'=>'shanghai']);
Hello,{$name}--{$city}
Route::get('hello', function () {
return 'hello,world!';
});
Route::get('hello/:name', function ($name) {
return 'Hello,' . $name;
});
Route::rule('hello/:name', function (Request $request, $name) {
//这里一般写在controller里,首先要继承think\controller基类,再引入think\facade\request,并且使用$this->request
//5.1版本使用$this->request->method() 5.0版本使用$request->method();
//在这里,只要引入think\facade\request即可
$method = $this->request->method();
return '[' . $method . '] Hello,' . $name;
});
//当然也有引入 think\facade\Response 类库
Route::get('hello/:name', function (Response $response, $name) {
return $this->response
->data('Hello,' . $name)
->code(200)
->contentType('text/plain');
});
//更多的情况是直接对资源文件的请求设置404访问
// 对于不存在的static目录下的资源文件设置404访问
Route::get('static', response()->code(404));
参数 | 说明 | 方法名 |
---|---|---|
method | 请求类型检测,支持多个请求类型 | method |
ext | url后缀检测,支持匹配多个后缀 | ext |
deny_ext | URL禁止后缀检查,支持匹配多个后缀 | denyExt |
https | 检查是否https请求 | https |
domain | 域名检测 | domain |
before | 前置行为检测 | before |
after | 后置行为执行 | after |
merge_extra_vars | 合并额外参数 | mergeExtraVars |
complete_match | 是否完全匹配路由 | completeMatch |
model | 绑定模型 | model |
cache | 请求缓存 | cache |
param_depr | 路由参数分隔符 | paramDepr |
ajax | ajax检测 | ajax |
pjax | pjax检测 | pjax |
response | 绑定response_send行为 | response |
validate | 绑定验证器类进行数据验证 | validate |
header | 设置response的header信息 | header |
append | 追加额外的参数 | append |
middleware | 注册路由中间件 | middleware |
merge_rule_regex | 合并路由规则 | mergeRuleRegex |
filter | 请求变量过滤 | filter |
例如: |
Route::get('new/:id','News/read',['ext'=>'html','https'=>true]);
//也可写成链式操作
Route::get('new/:id', 'News/read')
->ext('html')
->https();
/**
*URL后缀
*URL后缀如果是全局统一的话,可以在应用配置文件app.php中设置url_html_suffix参数
*如果当前访问的URL地址中的URL后缀是允许的伪静态后缀,那么后缀本身是不会被作为参数值传入的。
* false => 禁止伪静态访问
* 空字符串 => 允许任何伪静态后缀
* html => 只允许设置的伪静态后缀
*/
// 定义GET请求路由规则 并设置URL后缀为html的时候有效,就是要以.html结尾
Route::get('new/:id', 'News/read')
->ext('html');
//支持匹配多个后缀
Route::get('new/:id', 'News/read')
->ext('shtml|html');
//可以禁止访问的URL后缀
Route::get('new/:id', 'News/read')
->denyExt('jpg|png|gif');
/**
*域名检测
*/
// 完整域名检测 只在news.thinkphp.cn访问时路由有效
Route::get('new/:id', 'News/read')
->domain('news.thinkphp.cn');
// 子域名检测
Route::get('new/:id', 'News/read')
->domain('news');
/**
*HTTPS检测
*/
// 必须使用HTTPS访问
Route::get('new/:id', 'News/read')
->https();
// 必须使用HTTP访问
Route::get('new/:id', 'News/read')
->https(false);
/**
*前置行为检测
*支持使用行为对路由进行检测是否匹配,如果行为方法返回false表示当前路由规则无效。
*/
Route::get('user/:id', 'index/User/read')
->before(['\app\index\behavior\UserCheck']);
/**
*路由绑定模型
*/
Route::get('hello/:id', 'index/index/hello')
->model('id', '\app\index\model\User');
/**
*缓存路由请求,保留3600秒
*/
Route::get('new/:name$', 'News/read')
->cache(3600);
/**
*设置header信息
*/
Route::get('new/:name$', 'News/read')
->header('Access-Control-Allow-Origin','*');
Route::rule('hello/:name','hello')
->middleware('Auth');
//对路由分组进行注册中间件
Route::group('hello', function(){
Route::rule('hello/:name','hello');
})->middleware('Auth');
在定义了大量的路由规则之后,开启该缓存可以明显提升路由解析性能,而且路由规则越多越明显。 在应用配置文件app.php中设置开启:
'route_check_cache' => true,
开启后,会自动对每次的路由请求的调度进行缓存,第二次如果是相同的请求则无需再次经过路由解析,而是直接进行请求调度。
如果某个路由或者分组需要支持跨域请求,可以使用
Route::get('new/:id', 'News/read')
->ext('html')
->allowCrossDomain();
Route::group('分组名(字符串)或者分组路由参数(数组)','分组路由规则(数组或者闭包)');
Route::group('blog', [
':id' => 'Blog/read',
':name' => 'Blog/read',
])->ext('html')->pattern(['id' => '\d+']);
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。