ThinkPHP Framework ——十年匠心的高性能PHP框架

Overview

ThinkPHP 6.0

运行环境要求PHP7.1+,兼容PHP8.0。

官方应用服务市场 | ThinkAPI——官方统一API服务

ThinkPHPV6.0版本由亿速云独家赞助发布。

主要新特性

  • 采用PHP7强类型(严格模式)
  • 支持更多的PSR规范
  • 原生多应用支持
  • 更强大和易用的查询
  • 全新的事件系统
  • 模型事件和数据库事件统一纳入事件系统
  • 模板引擎分离出核心
  • 内部功能中间件化
  • SESSION/Cookie机制改进
  • 对Swoole以及协程支持改进
  • 对IDE更加友好
  • 统一和精简大量用法

安装

composer create-project topthink/think tp 6.0.*

如果需要更新框架使用

composer update topthink/framework

文档

完全开发手册

参与开发

请参阅 ThinkPHP 核心框架包

版权信息

ThinkPHP遵循Apache2开源协议发布,并提供免费使用。

本项目包含的第三方源码和二进制文件之版权信息另行标注。

版权所有Copyright © 2006-2020 by ThinkPHP (http://thinkphp.cn)

All rights reserved。

ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。

更多细节参阅 LICENSE.txt

Comments
  • 建议,关于TP5模型的关联预载入

    建议,关于TP5模型的关联预载入

    我看了SQL日志,发现关联用的还是join, 据我所知,现在一般是建议少用join, 改成将外键ID提取出来,然后单独查询一次。

    比如userrole两个表,user表有个role_id字段, 先执行SELECT id,role_id,username,xxx FROM user LIMIT 20 再执行SELECT id, role_name FROM role WHERE id IN(上一条语句查出来的所有role_id)

    opened by cos800 16
  • 如何实现58同城信息发布页的路由功能

    如何实现58同城信息发布页的路由功能

    58同城信息发布页面的路由顺序如下: 1、选择大类页面:http://post.58.com/1 (“/”后面的1代表城市ID,这里代表“北京”) 2、选择小类页面:http://post.58.com/1/1/s2 (“1/”后面的“1”代表大类ID,这里代表“房屋信息”,后面的“s2”代表大类) 3、信息发布页面:http://post.58.com/1/8/s5 (“1/”后面的“8”代表小类ID,这里代表“租房”,后面的“s5”代表小类) 问题: 以上四个路由参数,用Route::domain()或者Route::rule()方法如何实现呢?

    opened by shaohao2014 14
  • 对自定义路由支持增强

    对自定义路由支持增强

    现在的路由貌似都只能针对url中的REQUEST_URI识别并绑定模块控制器和方法,无法针对其他数据比如post中的数据来识别 一个很现实的例子:我们在对接微信的时候,微信推送的消息通常是post请求,请求体是一个xml结构,微信的异步通知接口也只有一个,假如相关业务逻辑比较复杂,很容易导致一个action中代码上千甚至上万行,而通常开发者的解决方案都是引入各种千奇百怪的函数,导致维护成本越来越高,这完全相悖与mvc模式的初衷 还拿微信举例,开发者其实更加期望能够自定义的识别请求中的任何参数,根据参数来做动态式的绑定, 比如:建立一个wechat模块,微信推送点击事件的时候,可以自定义到click控制器中,当推送扫码事件的时候,可以自定义绑定到event控制器中,当推送文字可以自定义到message控制器中,开发者又可以根据消息类型执行text方法或者image方法等等

    opened by jin123456bat 13
  • 命令行执行控制台问题

    命令行执行控制台问题

    因为项目中配置了config_path 是 application/config
    command.php和所有配置文件都在pplication/config下
    然后在think里也增加config_path的配置
    执行php think 命令 找不到命令
    取消think中的config_path配置并把command.php放到默认的application下命令就可以执行了 但是这下又加载不了配置文件 把其他配置文件从pplication/config下移动到application下才可以

    opened by pgyf 13
  • 没有了ROOT,静态文件路径有留有办法吗?

    没有了ROOT,静态文件路径有留有办法吗?

    没了已下,怎么办?

    if(!IS_CLI) {
        // 当前文件名
        if(!defined('_PHP_FILE_')) {
            if(IS_CGI) {
                //CGI/FASTCGI模式下
                $_temp  = explode('.php',$_SERVER['PHP_SELF']);
                define('_PHP_FILE_',    rtrim(str_replace($_SERVER['HTTP_HOST'],'',$_temp[0].'.php'),'/'));
            }else {
                define('_PHP_FILE_',    rtrim($_SERVER['SCRIPT_NAME'],'/'));
            }
        }
        if(!defined('__ROOT__')) {
            $_root  =   rtrim(dirname(_PHP_FILE_),'/');
            define('__ROOT__',  (($_root=='/' || $_root=='\\')?'':$_root));
        }
    }
    
    question 
    opened by XiaoXuanBing 13
  • model怎么正确从配置文件中读取配置并生效?

    model怎么正确从配置文件中读取配置并生效?

    我看了下think\model的代码,如果不设置需要自动写入时间戳为真,实例化的时候就会执行$this->db()建立一次连接(生成缓存)

      /**
         * 架构函数
         * @access public
         * @param array|object $data 数
         */
        public function __construct($data = [])
        {
          ...
            if (is_null($this->autoWriteTimestamp)) {
                // 自动写入时间戳
                $this->autoWriteTimestamp = $this->db()->getConfig('auto_timestamp');
            }
          ...
        }
    

    当我复写了$connection配置,执行到$this->db()返回的还是上次缓存的连接, 并没有reset掉连接配置,下面的代码

    /**
         * 获取当前模型的数据库查询对象
         * @access public
         * @param bool $baseQuery 是否调用全局查询范围
         * @return Query
         */
        public function db($baseQuery = true)
        {
            $model = $this->class;
            if (!isset(self::$links[$model])) {
                ...
            }
            // 返回当前模型的数据库查询对象
            return self::$links[$model];
        }
    

    所以,现在我怎样才能让model使用从配置文件中读取的配置?

    opened by TIGERB 11
  • where($map)->select() 出错

    where($map)->select() 出错

    我在测试使用 5.0 Beta 中来读取 wordpress 中的 posts 发现 select 出错

    public function getBlog_bug(){
        $model = D('posts');
        $map_post['post_status'] = 'publish';
        $model->where($map_post)->select();
    }
    

    以下是错误报告

        Fatal error: Call to a member function quote() on a non-object in C:\wamp\www\lab\thinkphp\thinkphp_5.0.0_beta\thinkphp\library\think\db\driver.php on line 1132
        Call Stack
        #   Time    Memory  Function    Location
        1   0.0012  140512  {main}( )   ..\index.php:0
        2   0.0022  151504  require_once( 'C:\wamp\www\lab\thinkphp\thinkphp_5.0.0_beta\thinkphp\start.php' )   ..\index.php:6
        3   0.0186  434096  think\App::run( )   ..\start.php:51
        4   0.0313  696456  invoke ( )  ..\app.php:109
        5   0.0313  696504  index\controller\Index->getBlog_bug( )  ..\app.php:109
        6   0.0380  1200616 think\Model->select( )  ..\index.php:21
        7   0.0385  1207392 think\db\Driver->select( )  ..\model.php:467
        8   0.0385  1207408 think\db\Driver->buildSelectSql( )  ..\driver.php:1040
        9   0.0385  1207536 think\db\Driver->parseSql( )    ..\driver.php:1061
        10  0.0386  1209808 think\db\Driver->parseWhere( )  ..\driver.php:1080
        11  0.0386  1210464 think\db\Driver->parseWhereItem( )  ..\driver.php:582
        12  0.0387  1211056 think\db\Driver->parseValue( )  ..\driver.php:664
        13  0.0387  1211080 think\db\Driver->escapeString( )    ..\driver.php:457
    

    目前我只好先写成这样了,可以成功运行

    $output['data'] = $model->where('post_status = "publish"')->select();
    
    opened by dotku 11
  • 路由:匹配规则是从前向后匹配,导致有些路由匹配不到

    路由:匹配规则是从前向后匹配,导致有些路由匹配不到

    路由文件:

    Route::get('news', 'index/testController/test1');
    
    Route::get('news_detail', 'index/testController/test2');
    

    控制器

        public function test1()
        {
            echo 'new';
        }
        public function test2()
        {
            echo 'news_detail';
        }
    

    当访问/news_detail的时候 会匹配到/new 的路由, 这使一个刚刚接触,没有仔细阅读文档的开发人员 十脸懵逼。。。

    RuleItem.php第 248 行左右

    if (0 === strcasecmp($rule, $url) || (!$completeMatch && 0 === strncasecmp($rule, $url, strlen($rule)))) { return $var; }

    改成 if (0 === strcasecmp($rule, $url) || (!$completeMatch && rule == $url )) { return $var; } 后解决。

    opened by meiyoufengzhengdexian 9
  • 模板block嵌套 Undefined index 报错

    模板block嵌套 Undefined index 报错

    `think/thinkphp/library/think/Template.php $blocks[$parent]['content'] = str_replace($blocks[$name]['begin'] . $blocks[$name]['content'] . $blocks[$name]['end'], $replace, $blocks[$parent]['content']);

    $blocks[$name] Undefined index $val or $baseBlocks[$name]`

    bug 
    opened by XiaoXuanBing 9
  • tp5里模版引用其它文件时view_path无效.

    tp5里模版引用其它文件时view_path无效.

    tp5里模版引用其它文件时view_path无效,详见如下:

    //index.html 
    //文件位置:[ VIEW ] D:\servers\htdocs\think-5.0-rc2\public\tmp\index\index.html [ array ( 'name' => 'thinkphp', ) ]
    
    {include file="index@view/index/public/abc/def/g" /}
    //文件位置:D:/servers/htdocs/think-5.0-rc2/application/index/view/index/public/abc/def/g.html
    //这是可以正常识别
    
    {include file="index/public/abc/def/g" /}
    //文件位置:D:/servers/htdocs/think-5.0-rc2/public/tmp/index/public/abc/def/g.html
    //这句不能识别,因为template->parseTemplateFile()中的$this->config['view_path']为空引起错误.
    //https://github.com/top-think/think/blob/master/thinkphp/library/think/Template.php#L1017
    
    {include file="abc" /}
    //这样正常.
    

    ...

    //index.php
    namespace app\index\controller;
    
    class Index
    {
        public function index()
        {
            $view = new \think\View([
                'view_path'   => realpath('./tmp'),
                'view_suffix' => '.html',
                'view_depr'   => DS,
                'view_layer'  => VIEW_LAYER,
                'parse_str'   => [],
                'engine_type' => 'think',
            ]);
            // 渲染模板输出 并赋值模板变量
            return $view->config('view_path','./tmp')->fetch('index', ['name' => 'thinkphp']);
        }
    }
    

    https://github.com/top-think/think/blob/master/thinkphp/library/think/Template.php#L1017 这里的(defined('THEME_PATH') && substr_count($template, '/') < 2 ? THEME_PATH : $this->config['view_path']);条件我不清楚你们有什么用意但是 $this->config['view_path'] 中永远为空.所以返回的路径不是绝对路径.从而导致parseTemplateName不能得到文件内容.

    希望能找到**$this->config['view_path']**总为空的原因. 另外最新的git,也同样有这个问题.

    opened by momoca 9
  • Db::table 子查询无法实现

    Db::table 子查询无法实现

    在官方文档中有看到使用Db::table传入子查询SQL语句,但实际上Db::table并不支持这种传值。

    Db::table($subQuery.' a')
        ->where('a.name','like','thinkphp')
        ->order('id','desc')
        ->select();
    

    Query类的处理是这样的

             if (strpos($table, ',')) {
                    $tables = explode(',', $table);
                    $table = [];
                    foreach ($tables as $item) {
                        list($item, $alias) = explode(' ', trim($item));
                        if ($alias) {
                            $this->alias([$item => $alias]);
                            $table[$item] = $alias;
                        } else {
                            $table[] = $item;
                        }
                    }
                } elseif (strpos($table, ' ')) {
                    list($table, $alias) = explode(' ', $table);
                    $table = [$table => $alias];
                    $this->alias($table);
                }
    

    无法准备分析出 subTable

    opened by zoujingli 8
  • tp 6.0.13,应用config无法覆盖全局config

    tp 6.0.13,应用config无法覆盖全局config

    目前版本:6.0.13LTS 问题:开启多应用模式后,按官方示例在应用下建立config目录,并往config目录从新建相关配置,但是实测下来,session,cache都无法覆盖全局配置,虽然应用下config里配置了相关设置,但是实际生效依旧为全局config。另外,在文档中说cache在开启多应用模式的情况下,默认是会区分应用的,但是实测下来跨应用读取cache依旧可行,并未区分隔离。 我在文档配置页看到评论区有人在1年前就提过这个问题,但是官方没有回复,到目前似乎也没有修复。

    另:如果是我哪个地方操作有问题,也请回答说明一下,谢谢

    官方示例: Junef1663060970 项目实例: Junef1663061139

    opened by lemon3364586 3
  • [6.0.12 LTS]Db where生成的语句有误,指定in还是变成=

    [6.0.12 LTS]Db where生成的语句有误,指定in还是变成=

    Db::table('think_user') ->where('id', 'IN', function ($query) { $query->table('think_profile')->where('status', 1)->field('id'); }) ->select();

    这个查询的不是in,是=,怎么解决

    同样 Db::table('think_user') ->where('id', 'IN', '(select user_id from think_vips)') ->select();

    生成的语句为 select * from think_user where id = (select user_id from think_vips) 预期的则是 select * from think_user where id in (select user_id from think_vips)

    opened by wuyifan66 2
  • 咨询一下动态修改配置的问题。

    咨询一下动态修改配置的问题。

    版本:ThinkPHP v6.0.12

    我定义了一个service,在boot()或者register()方法中使用如下代码动态修改配置信息,会出现部分修改后的配置不生效的问题,代码如下:

    public function boot()
    {
        // 修改文件系统配置
        $filesystem = config('filesystem');
        $filesystem['disks']['public']['url'] = '/storage/test';
        $filesystem['disks']['public']['root'] = $this->app->getRootPath().'public'.DIRECTORY_SEPARATOR.'storage'.DIRECTORY_SEPARATOR.'test';
        config(['filesystem' => $filesystem]);
        // 修改缓存配置
        $cache = config('cache');
        $cache['stores']['file']['path'] = $this->app->getRuntimePath().'cache'.DIRECTORY_SEPARATOR.'test';
        config(['cache' => $cache]);
    }
    

    经过测试: 修改了文件系统配置后,上传文件会存放到public/storage/test目录中; 修改了缓存配置后,通过Cache::set()方法设置缓存,缓存并没有存放到runtime/cache/test目录中,但打印Cache::getConfig()Cache::getStoreConfig('file')方法确实可以得到修改后的配置值。

    问题: 如何动态修改缓存配置并使其生效?

    非常感谢。

    opened by Abbotton 0
Releases(v6.1.0)
  • v6.1.0(Nov 1, 2022)

  • v6.0.13(Jul 15, 2022)

    • 改进Request类filterValue方法的兼容性
    • 更新 prettify.js 为新的 cdn 地址
    • FIX:remember缓存读取问题修复
    • 优化IDE支持
    • Redirect remember 支持完整url设置
    • 调整路由初始化位置
    • Bugfix: 修复 PSR-7 Response 用法
    • Fix switchLangSet missing setLangSet (https://github.com/top-think/framework/pull/2705)
    • 兼容 PHP 8.1
    • Windows环境下文件访问地址不正确
    • 修复传空值被忽略的情况
    • 优化 IDE 支持,忽略 zend studio 的无关文件
    • 增加 HEAD 路由支持,可以用来做健康检测 head /health
    Source code(tar.gz)
    Source code(zip)
  • v6.0.12(Jan 24, 2022)

    改进缓存驱动unserialize方法参数类型限制 优化代码使IDE友好 修正命令行对8.1的兼容性 路由增加闭包检测有效性

    Source code(tar.gz)
    Source code(zip)
  • v6.0.10(Dec 31, 2021)

    V6.0.10版本主要添加了PHP8.1的兼容支持,以及ThinkORM的一些改进,并宣布成为ThinkPHP历史上第二个LTS版本。

    • 兼容PHP8.1
    • 改进cookie跨域删除
    • 改进多语言自动加载
    • 改进url生成
    • Filesystem增加url方法 获取文件访问地址
    • 文件上传错误支持多语言
    • 修正 make:controller 指令错误
    • 发送cookie前先检查请求头是否已发送
    • 改进多文件上传的文件hashName冲突问题
    • 调整thinkPath路径赋值为真实绝对路径 以避免特殊环境潜在隐患
    • 支持 psr7 response
    • 控制器中间件支持动态参数
    • 改进env文件解析
    Source code(tar.gz)
    Source code(zip)
  • v6.0.9(Jul 22, 2021)

    本版本主要添加了事件监听的通配符支持,并修正了框架的一处可能的序列化漏洞,同时对模型做了一些改进和优化。

    • 更新league/flysystem版本
    • 事件监听支持通配符
    • 支持时间字段的统一配置
    • 改进Request类all方法
    Source code(tar.gz)
    Source code(zip)
  • v6.0.7(Jan 25, 2021)

    V6.0.7版本主要针对上个版本做了一些修正,还意外收获了一些性能提升。是一个建议更新的版本。

    主要更新:

    • 修正Validate类的PHP8兼容性
    • 改进redis驱动的append方法
    • 修正路由匹配检测问题
    • 优化路由变量正则规则生成
    • 改进responseView的内容渲染
    Source code(tar.gz)
    Source code(zip)
  • v6.0.6(Jan 11, 2021)

    兼容composer2 生成配置文件 优化optimize:schema指令 增加socket-log 的 curl 超时设置 修正路由匹配 兼容PHP8处理 增加汉字识别匹配范围 支持部分生僻字正则 改进响应文件请求时的缓冲清除 资源路由支持设置变量规则 $request->ip() 方法兼容PHP8 修复验证器in方法,between方法,使用数组,功能异常 修正含有__make的类实例化后未执行invokeAfter的问题 修复命令行创建中间件命名空间无效 bug

    Source code(tar.gz)
    Source code(zip)
  • v5.1.41(Jan 11, 2021)

  • v6.0.5(Oct 26, 2020)

    兼容Composer 2.0 修正验证类append方法 改进缓存标签机制 改进闭包路由内使用request对象 改进文件缓存驱动

    Source code(tar.gz)
    Source code(zip)
  • v6.0.4(Sep 29, 2020)

    主要更新:

    新增

    [新增] 多语言支持解析json文件 [新增] 增加app.url配置 用于命令行下构建request [新增] 模型类增加convertNameToCamel属性,支持数据格式转为驼峰命名输出 [新增] Relation类增加getForeignKey和getLocalKey方法

    修正

    [修正] 修复规则为空的bug [修正] 修正请求缓存中间件 [修正] 改进验证的append方法处理造成多次验证的情况 [修正] 改进资源路由对路由到类的支持 [修正] 修正重定向路由的传参 [修正] 调整http初始化位置 防止容器绑定自身造成死循环 [修正] 改进Redis驱动select参数处理 [修正] 改进多对多关联查询

    优化

    [优化] 优化session文件缓存 path获取 [优化] 改进路由参数检测 [优化] 改进路由参数获取和变量检查 [优化] 路由的请求缓存可以通过request_cache_key配置参数关闭 便于开发模式 [优化] 调整路由配置载入位置 [优化] 改进路由缓存指令 取消opis/closure依赖 [优化] 改进路由的额外参数检测 [优化] 改进Config类的has方法判断 [优化] 改进参数绑定对Null值的支持 [优化] 改进when条件查询的闭包处理 [优化] 改进一对一关联查询对order排序的支持

    Source code(tar.gz)
    Source code(zip)
  • v6.0.3(Jun 25, 2020)

    本次更新包含一个调试模式的系统信息安全隐患修正,建议更新。

    主要更新:

    • 异常提取session数据时先判断是否使用了session
    • 修正文件上传类
    • 取消EventwithEvent方法
    • FileResponse支持是否强制下载设置
    • Request对象支持ArrayAccess接口
    • 日志的时间记录增加微秒数据支持
    • 调整 Validate场景执行优先级
    • 优化App类getDefaultRootPath方法
    • 修正全局中间件获取param参数的BUG
    • clear命令支持多层级目录
    • 修正日志记录时区问题
    • 修复助手函数public_path
    • 中间件支持多个参数
    • 路由检测严格按照路由定义的顺序执行
    • FileResponse增加是否强制下载文件选项
    • 修复自定义命令别名比系统别名长导致报错问题
    • 改进路由到视图的变量传递
    • 允许路由到一个自定义调度类
    • 完善路由单元测试
    • 默认路由也支持自动OPTIONS请求
    • 改进路由调度
    • 改进host和port的获取支持代理
    • Request->port 的返回类型转化
    • 改进模型生成模板
    • 简化默认异常页面信息显示
    • 数据库支持设置缓存store
    • 改进optimize:schema指令
    • 为清理指令添加仅删除过期文件的选项
    • 请求缓存增加预检缓存配置 默认有效期1800秒
    • 支持header方式自动侦测多语言
    Source code(tar.gz)
    Source code(zip)
  • v6.0.2(Jan 21, 2020)

    本次更新包含一个可能的Session安全隐患修正,建议更新。

    主要更新:

    • 改进设置方法后缀后的操作名获取问题
    • 修正optimize:schema指令
    • 修正Request类inputData处理
    • 改进中间件方法支持多个参数
    • 修正sessionid检查的一处隐患
    • 完善对15位身份证号码的校验
    • 增加远程多对多关联支持
    • 增加MongoDb的事务支持(mongodb版本V4.0+)
    • 改进insertAllreplace支持
    Source code(tar.gz)
    Source code(zip)
  • v6.0.1(Dec 24, 2019)

    主要更新:

    • 完善Request::withInput
    • 修正Content-Type获取途径
    • 改进 SocketLog 驱动
    • 修正 ClientArg 获取途径
    • 修复FileResponse的cookie空对象异常
    • 支持渲染完整的异常链信息
    • 异常页面支持折叠调用堆栈信息
    • 改进异常响应时内容的一致性
    • 改进Error控制器对数字访问的支持
    • 修正redirect助手函数
    • memcached delete 支持 timeout
    • 修正redis驱动
    • 改进memcache驱动
    • 改进容器类invokeMethod方法
    • 使用新的数组语法替代list
    • 缓存默认的序列化方法改为serialize/unserialize
    • Add Cookie SameSite(PHP>7.3)
    • 扩展Socket驱动
    • 修正异常页面的模板文件
    • 事件监听去重
    • 取消视图日志
    • 修正验证jpg结尾的图片报错问题
    • 改进Url生成
    • 改进Url生成伪静态后缀设置false的情况
    • 改进File类型session读取gzcompress问题
    • 修复使用路由验证后路由变量丢失的问题
    • 修正多应用下路由目录路径
    • 修复 expand_level选项异常
    • 改进Cache类remember方法对依赖注入的支持
    • 防止因日志配置异常时陷入死循环
    • 模型支持动态设置数据库连接
    • 修正column方法的查询缓存问题
    • 改进Query类的getAutoInc方法
    • 改进模型更新条件获取
    • 修正使用模型对象更改数据时忽略自定义的suffixconnection参数
    • 修正XA事务
    • 规范column方法的查询
    Source code(tar.gz)
    Source code(zip)
  • v5.1.40(Oct 9, 2020)

    改进redis驱动has方法 修正XA事务 修正HasManyThrough关联 增加mysql json类型字段->>方式获取支持 改进路由加载 避免加载编辑器临时文件影响 修复关联模型的属性直接附加到当前模型,当关联模型字段名为name时获取的值为模型的属性name值 修复多态关联预加载field无效 改进Collection类的column方法的PHP兼容性问题 改进mysql驱动 改进parseclosure方法 SoftDelete删除条件做空判断 改进验证类append方法

    Source code(tar.gz)
    Source code(zip)
  • v5.1.39(Nov 17, 2019)

    本次更新为常规更新,主要包括:

    • 修正memcached驱动
    • 改进HasManyThrough关联查询
    • 改进RequestisJson方法
    • 改进关联查询
    • 改进redis驱动
    • 增加 Model类getWhere方法对复合主键的支持
    • 改进newQuery方法
    • 改进闭包查询的参数绑定
    • 修正Validate
    • 修复某些情况下URL会多一个冒号
    • 调整composer.json
    • 修复使用Cache::clear()时,报错缓存文件不存在问题
    • 使用File类的unlink方法进行文件删除
    • 改进paraseData方法
    • 修正image验证方法
    • 改进Url生成
    • 改进空操作对数字的支持
    • 改进一处PHP7.4兼容性问题
    Source code(tar.gz)
    Source code(zip)
  • v6.0.0(Oct 24, 2019)

    官方历时一年多倾力打造的ThinkPHP6.0版本正式发布,该版本基于精简核心和统一用法两大原则在5.1的基础上对底层架构做了进一步的优化改进,并更加规范化。

    由于引入了一些新特性,ThinkPHP6.0运行环境要求PHP7.1+(推荐PHP7.3+),不支持5.1的无缝升级(官方提供了升级指导)。

    主要特性:

    • 采用PHP7强类型(严格模式)
    • 支持更多的PSR规范
    • 多应用支持
    • ORM组件独立
    • 改进的中间件机制
    • 核心架构服务化
    • 全新的事件系统
    • 容器功能增强
    • 模板引擎组件独立
    • 内部功能中间件化
    • SESSION机制改进
    • 缓存及日志支持多通道
    • 引入Filesystem组件
    • Swoole以及协程支持改进
    • 对IDE更加友好
    • 统一和精简大量用法

    强类型及严格模式

    在主流框架里面,ThinkPHP6.0是最先采用PHP7严格模式的。所有的核心文件都是开启了严格模式的类型约束,因此有任何的变量类型不符的情况都会抛出异常,有利于规范代码中的变量类型和提前发现问题隐患。

    多应用模式

    新版框架提供了多应用模式支持,默认安装为单应用,你只需要安装一个多应用模式扩展就可以更轻松的部署多个应用而不需要重复安装依赖组件,每个应用都支持独立入口访问以及域名绑定,也可以使用一个入口文件实现自动多应用部署。并且自动多应用模式支持智能识别,对于不存在的应用访问会自动切换到单应用模式进行匹配。同时支持应用的映射和禁止访问机制。

    多应用模式的设计可以让开发更加模块化,因为每个应用的配置、路由及视图都可以纳入应用目录,所以更方便应用的模块化,甚至引入composer应用。

    容器和服务

    新版的容器支持PSR-11规范,容器类的功能特性主要包括:

    • 绑定类、对象实例、接口到容器
    • 创建类的实例(存在则直接获取)
    • 容器对象绑定别名
    • 支持容器对象(实例化)回调
    • 获取容器对象实例
    • 删除容器中的对象实例
    • 提供依赖注入和门面实现支持
    • 调用容器对象实例的方法(或者闭包)
    • 提供容器对象的ArrayAccess支持

    事件系统

    新版的事件系统可以看成是5.1版本行为系统的升级版,事件系统相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。支持事件智能订阅,通过反射机制来识别当前订阅者要订阅的事件。

    事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。

    中间件支持完善

    中间件分为全局中间件、应用中间件、路由中间件和控制器中间件,这四个中间件分组完全独立执行,但同一个分组内的中间件不会重复执行。中间件方法执行依赖注入,以及请求结束的回调机制。

    核心很多功能都是基于中间件来完成,包括多应用模式也是采用中间件机制执行。

    路由和请求

    新版的路由精简了很多不必要的功能,路由定义也更加规范化和语义化,并且路由定义文件支持纳入应用目录,便于模块化开发。路由注解功能独立为think-annotation库,并且使用更加规范,支持IDE提示。

    新版的请求对象更易扩展,系统默认安装后提供了一个app\Request类,你可以在应用中直接自定义请求对象,增加必要的属性和方法。但不会影响对think\Request的依赖注入和门面调用。

    系统服务

    由于核心框架采用了服务化设计,你可以在你的扩展或者应用中注册需要的服务。在系统服务中注册一个对象到容器,或者对某些对象进行相关的依赖注入。由于系统服务的执行优先级问题,可以确保相关组件在执行的时候已经完成相关依赖注入。一个服务类通常包括注册(register)和启动(boot)方法,用于不同阶段的执行。

    ORM组件化

    内置的ORM功能已经完全独立为think-orm组件,可以独立使用,ThinkPHP6.0默认依赖安装了该组件,保持用法不变的同时,增强了查询功能。

    模板引擎组件化

    核心不再内置任何模板引擎,仅提供PHP模板支持,官方的模板引擎已经独立为think-template模板引擎,并默认依赖安装。你可以更方便的使用第三方模板引擎。

    日志系统

    日志支持多通道、并统一命令行和WEB日志格式,主要包括:

    • 日志增加多通道支持,可以同时或者切换写入多个通道
    • WEB和CLI的日志记录格式统一,并支持日志格式化
    • 对JSON日志格式的改进
    • 支持日志写入事件

    Session机制改进

    6.0版本的Session机制完全重写了,并且不再使用PHP内置的Session机制,全新实现一套Session机制,可以更好的支持Swoole/Workerman等环境。

    所以不再支持PHP内置的session_*** 系列函数,也不再支持使用$_SESSION读取session数据,你必须通过框架提供的Session类或者门面来操作,Request类也封装了Session数据的读取。

    Session支持跨应用读取和自定义序列化机制,默认采用文件类型记录Session数据,由于共用了缓存机制,你还可以使用任何支持的缓存类型来记录Session数据。

    引入Filesystem组件

    新版增加了Filesystem类库对文件系统强化了支持,而且可以很方便的支持各种云存储,包括阿里云和七牛云。

    Swoole扩展改进

    Swoole扩展同时支持HTTPSocket服务,支持数据库和缓存的连接池功能,以及RPC功能。

    调试工具更新

    原来内置的页面Trace调试工具已经更改为扩展的方式,改成安装think-trace扩展,如果通过composer安装应用的话,默认会安装topthink/think-trace扩展。

    基本用法和之前保持不变,但无需额外配置,默认使用html方式显示,同时仍然支持浏览器控制台显示,并仅在调试模式下有效。

    同时增加了一个基于debugbar的调试扩展think-debugbar,需要单独安装后才能使用。

    composer require topthink/think-debugbar
    

    统一和精简大量用法

    新版对很多用法进行了精简和统一,尽可能避免在开发过程中规范不一的困惑。

    开发手册

    更多内容可以查看官方的完全开发手册

    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-rc5(Oct 14, 2019)

    主要更新如下:

    多应用模式调整

    鉴于多应用模式的复杂性和扩展性考虑,最新版本把多应用模式独立为框架的一个全局中间件扩展。默认安装后核心框架为单应用模式,如果需要使用多应用模式,可以安装

    composer require topthink/think-multi-app
    

    安装后会自动注册一个全局中间件并优先执行,就可以自动支持多应用模式,无需做任何的配置调整。如果需要进行应用映射或者域名绑定的话,仍然设置app_map以及domain_bind即可。

    如果你的入口文件是index.php的话,会自动开启自动多应用模式。如果你的入口文件是其它,例如admin.php或者api.php则会自动绑定admin或者api应用,当然,如果你在入口文件中已经使用name方法绑定了应用,则优先。

    另外,如果是自动多应用模式下,URL里面的应用不存在,会自动处理为单应用解析,也就是说多应用和单应用是可以在新版的架构下共存。举个例子,当我们访问下面的URL:

    http://tp.com/think
    

    假设think应用并不存在(也没有定义任何的应用映射),当我们访问上面的地址的时候会自动进行单应用解析,也就是说如果有定义全局路由(例如route/route.php)的话

    Route::get('think', function () {
        return 'hello,ThinkPHP!';
    });
    

    页面会输出

    hello,ThinkPHP!
    

    这样设计的初衷是为了更加方便扩展注册全局路由,避免在开启多应用模式的情况下注册的全局路由失效(比如之前的验证码扩展只能用于单应用模式,多应用模式需要单独注册路由)。

    如果你完全不需要单应用模式,也可以设置使用严格的多应用模式

    'app_express'    =>    true,
    'default_app'    =>    'home',
    

    当我们再次访问

    http://tp.com/think
    

    的时候,其实是访问默认(home)应用的think路由。

    中间件机制改进

    由于多应用扩展独立后,中间件机制也随之进行了一些优化和调整,现在中间件大致分为四个组,包括全局中间件、应用中间件、路由中间件和控制器中间件,每个中间件组彼此独立按顺序运行。

    app/middleware.php文件里面定义的中间件即为全局中间件,执行优先级最高(相对于前置中间件而言),如果使用了多应用模式,并且在应用目录下也定义了middleware.php文件,即为应用中间件,执行优先级仅次于全局中间件。

    如果在路由注册的时候定义了中间件即为路由中间件,注意,在路由中间件执行之前是获取不到当前应用的控制器和操作名的(所以,全局中间件和应用中间件执行的过程中是无法获取控制器和操作名的),如果你不想在路由注册的时候定义中间件,还有一个额外的办法,就是在路由配置文件(包括全局路由配置和应用路由配置)中定义middleware参数,无论是否匹配路由都会执行,类似于全局路由中间件的概念。

    'middleware'    =>    [
        app\middleware\Auth::class,
        app\middleware\Check::class,
    ],
    

    中间件调度优化

    中间件的执行流程改进,think\middleware仅仅负责中间件的管理和调度,增加think\Pipeline类负责中间件的执行。并支持控制中间件的执行顺序。中间件配置文件的格式做了一些调整,除了定义中间件别名外,增加了执行优先级设置。

    return [
        // 别名或分组
        'alias'    => [
        ],
        // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
        'priority' => [
        ],
    ];
    

    中间件end回调

    中间件增加end回调,如果在中间件类中有定义end方法,则会在请求结束后统一调用。

    public function end(Response $response)
    {
    }
    

    中间件执行去重

    对于每个分组的中间件,会进行强制去重操作,也就是说在一个分组中的中间件只可能执行一次。

    模板目录自动识别

    模板目录无需再进行任何的配置,取消了view_base配置,改为自动识别,应用目录下的view目录优先,如果不存在,则会使用应用根目录下的view目录。如果要单独定义某个应用的模板目录,则使用view_path配置参数定义即可。

    事件智能订阅改进

    事件智能订阅的时候不再需要事先注册和定义事件,采用反射机制自动识别订阅事件。

    应用名获取调整

    多应用模式改成扩展后,核心已经完全解耦了多应用相关的方法和属性,所以如果你需要获取当前的应用名,需要改成

    app('http')->getName();
    

    对于使用中间件进行权限控制用途的,官方的建议是采用pathinfo地址进行权限判断。

    think-swoole扩展更新

    think-swoole扩展也在持续更新和完善,现在已经支持数据库和缓存的连接池功能,以及RPC功能。

    调试工具更新

    原来内置的页面Trace调试工具已经更改为扩展的方式,改成安装think-trace扩展,如果通过composer安装应用的话,默认会安装topthink/think-trace扩展,或者直接安装。

    composer require topthink/think-trace
    

    原核心内置的TraceDebug中间件不再使用,请在中间件定义文件中注释掉。

    基本用法和之前保持不变,但无需额外配置,默认使用html方式显示,同时仍然支持浏览器控制台显示,并仅在调试模式下有效。

    同时增加了一个基于debugbar的调试扩展think-debugbar,需要单独安装后才能使用。

    composer require topthink/think-debugbar
    
    Source code(tar.gz)
    Source code(zip)
  • v5.1.38(Aug 16, 2019)

    本次更新为常规更新,主要包括:

    • Request类增加isJson方法
    • 改进浮点型查询
    • 修正关联查询关联外键为空的查询错误
    • 远程一对多支持关联统计和预载入查询
    • 远程一对多关联支持has/hasWhere查询
    • 优化parseIn解析
    • 改进parseLike查询
    • 改进Url生成
    • 改进模型的toArray方法
    • 修正notIn查询
    • 改进JSON字段查询
    • 改进Controller类display/fetch方法返回ViewResponse对象
    • 改进param方法
    • 改进mysql驱动getExplain方法
    • 改进时间查询
    • 改进模型关联的has/hasWhere方法对软删除的支持
    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-rc4(Aug 16, 2019)

    RC4版本主要改进包括ORM库独立,日志系统增加多通道支持,缓存、日志、数据库的配置文件统一调整为多通道模式。

    本次更新相对于RC3版本主要涉及配置文件的更新,其它调整参考更新日志的用法调整部分。

    主要新特性

    数据库和模型改为独立的think-orm

    数据库和模型操作核心不再内置,改为统一依赖topthink/think-orm库(该类库已经包括其它的数据库驱动),用法保持一致,功能也没有任何的缺失。

    此前think-orm库已经独立更新维护,但一直是同步核心的ORM,2.0版本进行了架构调整,保持独立性的同时支持框架依赖,以后数据库操作这块统一在此类库更新。

    模型功能增强

    对模型做了大量的功能改进,主要包括:

    • 关联类增加withFieldwithLimit方法
    • 改进模型的hasWhere方法对闭包查询条件的支持完善
    • 支持has/hasWhere的多次调用
    • 模型的has/hasWhere方法支持软删除
    • 增加远程一对一关联
    • 远程一对一和一对多支持预载入及has/hasWhere查询
    • 模型类支持序列化及缓存操作
    • 关联预载入查询支持缓存
    • 模型方法支持依赖注入
    • 模型事件改进支持系统事件系统

    日志支持多通道、并统一命令行和WEB日志格式

    此次更新对日志类做了较大的调整和增强,主要包括:

    • 日志增加多通道支持,可以同时或者切换写入多个通道
    • WEB和CLI的日志记录格式统一,并支持日志格式化
    • 对JSON日志格式的改进
    • 支持日志写入事件

    增加Filesystem组件

    Filesystem组件用以替代之前的上传类,提供了更多上传到远端的扩展库支持。

    容器对象增加回调机制

    容器中的对象实例化之后,引入回调机制,利用该机制可以实现诸如注解功能等相关功能。

    你可以通过resolving方法注册一个全局回调

    Container::getInstance()->resolving(function($instance,$container) {
        // ...
    });
    

    回调方法支持两个参数,第一个参数是容器对象实例,第二个参数是容器实例本身。

    或者单独注册一个某个容器对象的回调

    Container::getInstance()->resolving(\think\Cache::class,function($instance,$container) {
        // ...
    });
    

    路由注解独立为think-annotation

    路由注解功能独立为think-annotation库,并且使用更加规范,支持IDE提示。

    多应用模式下路由定义支持纳入应用目录

    在多应用模式下,路由定义文件支持放入应用目录的route目录下。

    模板根目录默认放入根目录下的view目录

    模板根目录默认从应用目录下移动到根目录的view目录,如果是多应用模式的话,下面是应用子目录,如果你需要改回放入原先的应用目录下,可以在应用的template配置文件中定义view_path

    'view_path'    =>    app_path('view'),
    

    更新日志

    功能改进

    • 改进路由类的配置读取
    • 改进parseLike查询
    • 改进ViewResponse类增加内容渲染输出支持
    • 增加display助手函数
    • 验证类maker方法支持注入扩展验证规则
    • 改进事件触发的对象传入
    • 改进Console/Table
    • 改进关联定义对查询构造器的支持
    • 关联类增加withFieldwithLimit方法,并取消QuerywithField方法
    • 增加延迟关联查询对withLimit的支持
    • 改进模型toArray方法
    • 改进Url生成的域名参数
    • 改进 make:command指令生成
    • 缓存有效期支持DateInterval
    • 改进Query类find方法
    • 改进json查询
    • 改进查询缓存
    • 增加filesystem组件
    • 改进跨域请求
    • 改进路由检测缓存配置
    • 改进注解路由的文件写入
    • 路由注册支持注册options请求类型
    • 改进重定向路由检测
    • 改进模型的hasWhere方法对闭包查询条件的支持完善
    • 增加time_query_rule数据库配置参数 用于自定义时间查询规则
    • 改进时间字段类型的自动识别
    • 改进redis驱动
    • 容器对象增加invoke回调机制
    • 改进多对多关联
    • 资源路由增加withModelwithValidate对各个路由设置不同的模型绑定和验证
    • 改进getLastInsID方法
    • 日志类调整 支持多通道写入
    • 改进模型输出
    • 支持单独关闭某个通道的日志写入
    • 取消部署模式下 不写入调试日志的功能 用调试级别设置单独的日志渠道来替代
    • 改进日志记录格式
    • 支持日志输出格式化
    • 改进资源路由
    • 改进命令行日志实时写入
    • 日志通道支持单独设置level配置参数
    • Log类调整优化
    • 增加paginateX查询用于大数据分页查询
    • 数据集增加firstlast方法
    • 改进response/View类的assign方法
    • 改进请求参数获取问题
    • 改进pathinfo方法
    • 增加一些路径助手函数
    • 改进多级控制器访问
    • Log类支持__call方法
    • 多应用模式的路由定义支持放入单独的应用目录
    • 模型增加依赖注入支持
    • 改进模型事件
    • 改进页面Trace机制
    • 改进validate助手函数,支持设置验证失败后是否抛出异常
    • 改进容器bind方法
    • 改进Redis Session驱动
    • 改进日志记录的空行问题
    • 改进RedirectResponse
    • 改进缓存驱动
    • 改进think optimize:schema 指令
    • Url类增加https方法
    • 改进isPjax判断
    • 改进Db类配置获取

    问题修正

    • 修正模型属性获取
    • 修正Request类的过滤功能
    • 修正subDomain方法
    • 修正input助手函数
    • 修正模型refresh方法
    • 修正关联统计不使用子查询的方式
    • 修正Request类root方法
    • 修正缓存有效期处理
    • 修正MorphTo关联
    • 修正缓存标签
    • 修正mysql驱动insert方法
    • 修正Db类connect方法
    • 修正allowCrossDomain方法
    • 修正Query类chunk方法
    • 修正分组跨域
    • 修正关联预载入查询
    • 修正时间字段写入
    • 修正验证类checkSize
    • 修正多对多关联闭包
    • 修正RuleName类setRule方法
    • 修正whereTime查询
    • 修正request助手函数
    • 修正日志关闭配置
    • 修复对多字节字符的兼容性

    用法调整

    • 模型切换后缀方法switch更改为suffix
    • 关联定义仅支持查询类的方法
    • 取消Query类的fetchArray方法
    • select查询方法默认返回数据集对象
    • 取消optimize:config指令
    • 调整数据库和缓存配置文件格式 默认采用多类型支持 方便切换
    • Cache类的initconnect方法取消 并入store方法
    • cache助手函数取消初始化用法
    • cache助手函数留空返回Cache对象
    • 默认时间字段类型改为timestamp
    • 注解路由移出核心,注解相关功能使用topthink/think-annotation
    • 改进路由 取消url_convert配置参数
    • 取消route:build指令
    • 调整默认模板目录为根目录view
    • 取消默认的请求日志记录 在项目里面自己添加
    • 统一find查询必须使用查询条件
    • 扩展的service配置文件默认放到vendor目录下
    • 废除LogLevel事件
    • 取消App类的序列化方法
    • 控制台的user配置改为通过静态方法设置当前执行用户
    Source code(tar.gz)
    Source code(zip)
  • v6.0.0-rc3(Jun 3, 2019)

    RC3版本主要改进和优化了系统内置中间件,改进了一些用法和体验,并且把不常用的驱动移出核心改为扩展方式提供。

    主要新特性

    • 增加whereWeek日期查询
    • 自增ID获取支持类型自动转换
    • 当前请求记录匹配路由规则
    • 增加requireWithout验证规则
    • 优化路由ext和name方法以及URL生成
    • 增加项目自定义类
    • URL生成使用对象方式操作
    • 修改器改进
    • dump/halt助手函数调整支持输出多个变量
    • 关联自动更新
    • 模型数据集增加deleteupdate方法
    • 模型支持表后缀以及动态切换
    • 注解路由支持给某个路由指定所属分组
    • 多语言支持分组定义
    • 支持自定义加载语言文件
    • 多语言定义支持YML格式
    • 缓存标签改进
    • 缓存类增加push方法
    • Cookie保存时间支持DateTimeInterface
    • 增加表单令牌中间件
    • 控制器支持__call方法
    • 增加deny_app_list配置参数
    • 控制器中间件only和except定义不区分大小写
    • app_map支持指定泛应用映射

    问题修正

    • 修正参数绑定的浮点型精度问题
    • 修正软删除
    • 修正模型的数据库连接
    • 修正RedirectResponse
    • 修正Session类flush方法
    • 修正JSON字段参数绑定
    • 修正make:controller指令生成
    • 修正Cache类的get方法默认值
    • 修正域名绑定
    • 修正关联模型的动态获取器
    • 修正模型dateFormat属性方法
    • 修正url生成对多入口的支持
    • 修正ini配置文件格式的布尔值转换问题
    • 修正路由延迟解析全局配置无效的问题
    • 修正路由缓存问题
    • 修正关联update操作
    • 修正Relation::$selfRelation默认为null,导致Relation::isSelfRelation()方法报错
    • 修正redis缓存驱动
    • 修正事件智能订阅observe方法
    • 修正模型字段定义对日期查询无效的问题
    • 修正Console类getNamespaces方法
    • 修正where查询方法传入Query对象的时候缺少bind数据的问题
    • 修正request类method方法
    • 修正route:list指令
    • 修正Collectionload方法
    • 修正redis驱动的端口类型
    • 修正session数据序列化使用JSON处理的问题
    • 修正分组路由合并解析
    • 修正模型的hidden方法隐藏关联模型的问题
    • 修正关联查询关联键为空的错误
    • 修正返回204状态码的响应判断
    • 修正Requesthas方法对envsession的支持
    • 修正provider.php文件无效问题
    • 修正关联查询的部分问题
    • 修正validate助手函数支持指定验证器类
    • 修正验证类getValidateType方法
    • 修正入口单独开启调试模式
    • 修正加载Composer应用

    用法调整

    • 页面trace中间件仅在调试模式有效
    • Socket日志驱动移出核心
    • PostgreSQLSqliteSqlServer驱动移出核心 ,改为扩展
    • 取消内置think\Controller基类
    • Yaconf支持移出核心 纳入扩展think-yaconf
    • 字段排除改为withoutField方法
    • 取消useGlobalScope方法增加withoutGlobalScope方法
    • 更改默认生成的中间件位置
    • 加载默认语言包无需开启多语言中间件
    • Cookie类恢复gethas方法支持
    • token助手函数调整
    • 全局请求缓存参数调整
    • 统一中间件调用传参,不支持:分割传参
    • 缓存数据统一进行序列化后存储
    • Cache类rm方法更改为delete方法
    • validate助手函数返回Validate对象实例,参数改变

    废弃用法

    • 取消多语言的auto_detect配置
    • 取消session类的auto_start配置参数和boot方法
    • 废弃Where数组对象查询
    • 取消模型事件观察者
    • 取消JumpResponsesuccess/error/result等方法和助手函数
    • 取消表达式查询解析扩展及think\db\Expression
    • 废弃模型自动完成功能,使用模型事件替代
    • 取消cookieprefix参数
    • 取消一系列不推荐使用的助手函数
    • 取消optimize:facade optimize:model指令 改为扩展方式
    • 取消命令行执行URL
    • 删除Config__get__isset 方法
    Source code(tar.gz)
    Source code(zip)
  • v5.1.37(May 24, 2019)

    本次更新为常规更新,主要更新如下:

    • 改进关联数据更新
    • 修正关联动态获取器
    • 改进redis驱动
    • 修复验证规则里面出现二维数组时的错误
    • 改进跨域请求支持
    • 完善模型hidden方法对关联属性的支持
    • 改进where查询方法传入Query对象的支持bind数据
    • 改进数据集对象的load方法
    • 修正关联更新
    Source code(tar.gz)
    Source code(zip)
  • v5.1.36(Apr 28, 2019)

    本次更新为常规更新,主要更新如下:

    • 修正chunk方法一处异常抛出的错误
    • 修正模型输出的visible
    • 改进环境变量加载
    • 改进命令行日志的level配置支持
    • 修复设置有缓存前缀时,无法清空缓存标签的问题
    • HasMany关联类saveAll方法兼容Collection格式参数格式
    • 修正whereOr查询使用字符串的问题
    • 改进dateFormat设置对写入数据的影响
    • 修正查询缓存
    • 记住指定的跳转地址
    • 改进软删除
    • 改进聚合查询SQL去除limit限制
    • 改进缓存驱动
    Source code(tar.gz)
    Source code(zip)
  • v5.1.35(Mar 3, 2019)

    本次主要为常规更新,修正了一些反馈的问题。

    • 修正验证类自定义验证方法执行两次的问题
    • 模型增加isEmpty方法用于判断是否空模型
    • 改进获取器对append的支持
    • 修正一对多关联的withCount自关联问题
    • facade类注释调整
    • 改进关联属性的visiblehidden判断
    • 修正路由分组的MISS路由
    • 改进pgsql.sql
    Source code(tar.gz)
    Source code(zip)
  • v5.1.34(Jan 30, 2019)

    本次更新为常规更新,修正了一些反馈的问题。

    • 改进Request类的has方法,支持patch
    • 改进unique验证的多条件支持
    • 修复自定义上传验证,检测文件大小
    • 改进in查询支持表达式
    • 改进路由的getBind方法
    • 改进验证类的错误信息获取
    • 改进response助手函数默认值
    • 修正mysql的regexp查询
    • 改进模型类型强制转换写入对Expression对象的支持
    Source code(tar.gz)
    Source code(zip)
  • v5.0.24(Jan 11, 2019)

    本次更新包含了一个安全更新,建议更新

    • 改进关联的save方法
    • 改进模型数据验证
    • Collection增加values方法
    • 改进unique验证方法
    • 改进Request类的method方法
    Source code(tar.gz)
    Source code(zip)
  • v5.1.32(Dec 23, 2018)

    本次主要为常规更新,修正了一些反馈的问题。

    主要更新日志:

    • 改进多对多关联的attach方法
    • 改进聚合查询的field处理
    • 改进关联的save方法
    • 修正模型exists方法返回值
    • 改进时间字段写入和输出
    • 改进控制器中间件的调用
    • 改进路由变量替换的性能
    • 改进缓存标签的处理机制
    Source code(tar.gz)
    Source code(zip)
  • v5.1.31(Dec 10, 2018)

    本次版本包含一个安全更新,建议升级。

    • 改进field方法
    • 改进count方法返回类型
    • download函数增加在浏览器中显示文件功能
    • 修正多对多模型的中间表数据写入
    • 改进sqlsrv驱动支持多个Schemas模式查询
    • 统一助手函数与\think\response\Download函数文件过期时间
    • 完善关联模型的save方法 增加make方法仅创建对象不保存
    • 修改条件表达式对静态变量的支持
    • 修正控制器名获取
    • 改进view方法的field解析
    Source code(tar.gz)
    Source code(zip)
  • v5.0.23(Dec 10, 2018)

    本次版本更新主要涉及一个安全更新,推荐尽快更新到最新版本。

    • Query支持调用模型的查询范围
    • 聚合查询字段支持DISTINCT
    • 改进闭包验证的参数
    • 多对多关联支持指定中间表数据名称
    • after/before验证支持指定字段验证
    • 改进多对多关联
    • 改进验证类
    • 增加afterWithbeforeWith验证规则 用于比较日期字段
    • 完善规则提示
    • 改进断线重连
    • 修正软删除的destroy方法
    • 修复模型的save方法当data变量为空 数据不验证
    • 模型增加replace方法
    • MorphOne 增加 make 方法创建关联对象实例
    • 改进count方法返回值类型
    • 改进聚合查询方法的正则判断
    • 改进sqlsrv驱动
    • 完善关联的save方法
    • 修正控制器名获取
    Source code(tar.gz)
    Source code(zip)
  • v5.1.29(Nov 11, 2018)

    该版本主要改进了参数绑定的解析问题和提升性能,并修正了一些反馈的问题。

    • 改进手动参数绑定
    • 修正MISS路由的分组参数无效问题
    • 行为支持对象的方法
    • 修正全局查询范围
    • 改进belongsto关联的has方法
    • 改进hasMany关联
    • 改进模型观察者多次注册的问题
    • 改进query类的默认查询参数处理
    • 修正parseBetween解析方法
    • 改进路由地址生成的本地域名支持
    • 改进参数绑定的实际URL解析性能
    • 改进Env类的getEnvget方法
    • 改进模板缓存的生成优化
    • 修复验证类的多语言支持
    • 修复自定义场景验证remove规则异常
    • File类添加是否自动补全扩展名的选项
    • 改进strpos对子串是否存在的判断
    • 修复choice无法用值选择第一个选项问题
    • 验证器支持多维数组取值验证
    • 改进解析extendblock标签的正则
    Source code(tar.gz)
    Source code(zip)
  • v5.1.28(Oct 29, 2018)

    该版本主要修正了上一个版本存在的一些问题,并改进了关联查询

    • 改进聚合查询方法的字段支持DISTINCT
    • 改进定义路由后url函数的端口生成
    • 改进控制器中间件对swoole等的支持
    • 改进Log类save方法
    • 改进验证类的闭包验证参数
    • 多对多关联支持指定中间表数据的名称
    • 关联聚合查询支持闭包方式指定聚合字段
    • 改进Lang类get方法
    • 多对多关联增加判断关联数据是否存在的方法
    • 改进关联查询使用fetchsql的情况
    • 改进修改器的是否已经执行判断
    • 增加afterWithbeforeWith验证规则 用于比较日期字段
    Source code(tar.gz)
    Source code(zip)
Owner
ThinkPHP
ThinkPHP官方团队
ThinkPHP
CleverStyle Framework is simple, scalable, fast and secure full-stack PHP framework

CleverStyle Framework is simple, scalable, fast and secure full-stack PHP framework. It is free, Open Source and is distributed under Free Public Lice

Nazar Mokrynskyi 150 Apr 12, 2022
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

null 14 Aug 14, 2022
PHPR or PHP Array Framework is a framework highly dependent to an array structure.

this is new repository for php-framework Introduction PHPR or PHP Array Framework is a framework highly dependent to an array structure. PHPR Framewor

Agung Zon Blade 2 Feb 12, 2022
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

Rizky Alamsyah 14 Aug 14, 2022
Framework X – the simple and fast micro framework for building reactive web applications that run anywhere.

Framework X Framework X – the simple and fast micro framework for building reactive web applications that run anywhere. Quickstart Documentation Tests

Christian Lück 620 Jan 7, 2023
Framework X is a simple and fast micro framework based on PHP

Framework X is a simple and fast micro framework based on PHP. I've created a simple CRUD application to understand how it works. I used twig and I created a custom middleware to handle PUT, DELETE methods.

Mahmut Bayri 6 Oct 14, 2022
Spiral Framework is a High-Performance PHP/Go Full-Stack framework and group of over sixty PSR-compatible components

Spiral HTTP Application Skeleton Spiral Framework is a High-Performance PHP/Go Full-Stack framework and group of over sixty PSR-compatible components.

Spiral Scout 152 Dec 18, 2022
Sunhill Framework is a simple, fast, and powerful PHP App Development Framework

Sunhill Framework is a simple, fast, and powerful PHP App Development Framework that enables you to develop more modern applications by using MVC (Model - View - Controller) pattern.

Mehmet Selcuk Batal 3 Dec 29, 2022
A PHP framework for web artisans.

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

The Laravel Framework 72k Jan 7, 2023
The Symfony PHP framework

Symfony is a PHP framework for web and console applications and a set of reusable PHP components. Symfony is used by thousands of web applications (in

Symfony 27.8k Jan 2, 2023
Open Source PHP Framework (originally from EllisLab)

What is CodeIgniter CodeIgniter is an Application Development Framework - a toolkit - for people who build web sites using PHP. Its goal is to enable

B.C. Institute of Technology 18.2k Dec 29, 2022
Yii 2: The Fast, Secure and Professional PHP Framework

Yii 2 is a modern framework designed to be a solid foundation for your PHP application. It is fast, secure and efficient and works right out of the bo

Yii Software 14k Dec 31, 2022
CakePHP: The Rapid Development Framework for PHP - Official Repository

CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Associative Data Mapping, Front Controller, and MVC. O

CakePHP 8.6k Dec 31, 2022
Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs.

Slim Framework Slim is a PHP micro-framework that helps you quickly write simple yet powerful web applications and APIs. Installation It's recommended

Slim Framework 11.5k Jan 4, 2023
High performance, full-stack PHP framework delivered as a C extension.

Phalcon Framework Phalcon is an open source web framework delivered as a C extension for the PHP language providing high performance and lower resourc

The Phalcon PHP Framework 10.7k Jan 8, 2023
Official Zend Framework repository

Welcome to the Zend Framework 3.0 Release! RELEASE INFORMATION Zend Framework 3.0.1dev This is the first maintenance release for the Zend Framework 3

Zend Framework 5.6k Dec 29, 2022
🚀 PHP Microservice Full Coroutine Framework

PHP microservice coroutine framework 中文说明 Introduction Swoft is a PHP microservices coroutine framework based on the Swoole extension. Like Go, Swoft

Swoft Cloud 5.5k Dec 28, 2022
Open Source PHP Framework (originally from EllisLab)

CodeIgniter 4 Development What is CodeIgniter? CodeIgniter is a PHP full-stack web framework that is light, fast, flexible and secure. More informatio

CodeIgniter 4 web framework 4.5k Jan 2, 2023
FuelPHP v1.x is a simple, flexible, community driven PHP 5.3+ framework, based on the best ideas of other frameworks, with a fresh start! FuelPHP is fully PHP 7 compatible.

FuelPHP Version: 1.8.2 Website Release Documentation Release API browser Development branch Documentation Development branch API browser Support Forum

Fuel 1.5k Dec 28, 2022