ThinkPHP5.2第一个Beta版本发布测试

介绍

5.2版本的第一个Beta1测试版本发布,仅供学习和测试用途,暂时请不要用于实际项目。

5.2的目标致力于提供一个更简洁、更标准的核心框架,对于一些非必须功能力求组件化或者通过扩展解决。

目前已经完成的主要特性包括:

  • 基于PHP7.1+重构;

  • 强类型严格约束;

  • 完全依赖composer

  • 原生多应用支持;

  • 支持应用的Composer引入;

  • 引入事件系统;

  • 增加PSR-6PSR-16支持;

目前核心功能基于PHP7.1实现,未来的升级版本不排除要求PHP7.2+的可能性。

安装

composer create-project topthink/think tp5 5.2.*-dev

启动服务

cd tp5
php think run

然后就可以在浏览器中访问

http://localhost:8000

如果需要更新框架使用

composer update topthink/framework

目录结构

相对于5.1来说,5.2版本目录结构的变化不大,主要是默认应用目录改为appthinkphp目录不再放置根目录而是直接安装到vendor目录下。

www  WEB部署目录(或者子目录)
├─app 应用目录
│  ├─command.php        命令行定义文件
│  ├─common.php         公共函数文件
│  ├─event.php          事件定义文件
│  ├─controller         控制器目录
│  ├─model              模型目录
│  ├─view               视图目录
│  └─ ...               更多类库目录
├─config                应用配置目录
├─route                 路由定义目录
├─public                WEB目录(对外访问目录)
│  ├─index.php          入口文件
│  ├─router.php         快速测试文件
│  └─.htaccess          用于apache的重写
├─extend                扩展类库目录
├─runtime               应用的运行时目录
├─vendor                第三方类库目录(Composer依赖库)
├─composer.json         composer 定义文件
├─LICENSE.txt           授权说明文件
├─README.md             README 文件
├─think                 命令行入口文件

该目录结构只是默认生成的(单应用模式),具体会因为你是否采用多应用模式而存在差异。

入口文件

由于5.2版本完全依赖Composer,取消了原本的think\Loader类,因此入口文件的写法有所调整。

系统安装后提供了一个默认的入口文件(位于public/index.php),内容如下:

// [ 应用入口文件 ]namespace think;require __DIR__ . '/../vendor/autoload.php';// 执行应用并响应(new App())->run()->send();

如果app目录下面直接是controllermodel以及view等类库目录,则为单应用模式(默认模式),如果在app目录下创建了应用子目录,则自动变成多应用模式。

单应用和多应用的目录结构区别如下(主要在app目录):

单应用

├─app 应用目录
│  ├─controller         控制器目录
│  ├─model              模型目录
│  ├─view               视图目录
│  └─ ...               更多类库目录
├─public                WEB目录(对外访问目录)
│  ├─index.php          入口文件
├─config                应用配置目录
├─route                 路由定义目录
├─runtime               应用的运行时目录

多应用

├─app 应用目录
│  ├─index              主应用
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  ├─config          配置目录(优先)
│  │  └─ ...            更多类库目录
│  ├─app2               应用2│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  ├─config          配置目录(优先)
│  │  └─ ...            更多类库目录
├─public                WEB目录(对外访问目录)
│  ├─index.php          主入口文件
│  ├─app2.php           入口文件2├─config                应用配置目录
│  ├─index              index应用配置
│  └─app2               app2应用配置
├─route                 路由定义目录
│  ├─index              index应用路由定义目录
│  └─app2               app2应用路由定义目录
├─runtime               应用的运行时目录
│  ├─index              index应用运行时目录
│  └─app2               app2应用运行时目录

从目录结构可以看出来,每个应用相对保持独立,并且每个应用都有一个对应的入口文件,应用下面还可以通过多级控制器来维护控制器分组。

通过URL重写可以实现在一个统一的入口文件访问不同的应用。

新版的think\App类的定制性更灵活,你可以在入口文件中对应用进行定制。

// [ 应用入口文件 ]namespace think;require __DIR__ . '/../vendor/autoload.php';// 实例化应用$app = new App();// 设置当前应用的路径$app->path('path/to/name');// 开发调试模式$app->debug(true);// 设置应用名称$app->name('name');// 设置应用的命名空间$app->setNamespace('app\name');// 开启应用类库后缀$app->suffix(true);// 绑定当前应用的请求对象$app->bind('request', $request);// 执行应用并输出响应$app->run()->send();

如果你的某个应用来自于composer库,只需要在入口文件中指定应用的命名空间。

命令行

如果采用了多应用模式,命令行可以支持生成不同应用的类文件

php think make:controller index@User
php think make:model app2@Blog

Db类和模型

Db类也采用了Facade机制,所以你在使用Db类查询的时候,应该使用:

use think\facade\Db;...Db::name('user')->find();

模型的用法目前基本上变化不大。

事件机制

事件机制用于替代5.1版本的Hook和行为,可以通过命令行生成事件类。

php think make:event  index@User
namespace app\index\event;class UserLogin{}

生成监听器

php think make:listener index@UserLogin
namespace app\index\listener;class UserLogin{
    public function handle($event)
    {
        // 事件监听处理
    }   }

给事件绑定别名

Event::bind('UserLogin', '\app\index\event\UserLogin');

使用监听器

Event::listen('UserLogin', '\app\index\listener\UserLogin');

或者手动注册事件监听

use think\facade\Event;Event::listen('UserLogin', function(){});

生成事件订阅类

php think make:subscribe index@User
namespace app\index\subscribe;class User{
    public function onUserLogin($event)
    {
        // 事件响应处理
    }}

注册事件订阅者

Event::subscribe('\app\index\subscribe\User');

上面的相关操作可以通过在应用目录的event.php文件中直接配置,而无需手动操作。

return [
    'bind'    =>    [
        'UserLogin'    =>    ['\app\index\event\UserLogin'],
        // 更多事件别名定义
    ],
    'listen'    =>    [
        'UserLogin'    =>    ['\app\index\listener\UserLogin'],
        // 更多事件监听
    ],
    'subscribe'    =>    [
       '\app\index\subscribe\User',
        // 更多事件订阅
    ],];

内置已经绑定别名的事件包括AppInitAppBeginActionBeginAppEnd等,也就是说原来的Hook钩子已经全部改造为事件类。

废弃用法

  • 模块概念(应用下不再有模块的概念,用多级控制器替代);

  • Hook和行为系统(使用事件系统替代);

  • 路由的数组返回定义(统一使用方法定义路由);

  • Session的前缀机制(已经被简化);

  • Config的range机制(已经被简化);

  • 核心Facade类的别名(避免混淆而废弃);