2019-09-20 thinkphp6.0 踩坑

手册地址:https://www.kancloud.cn/manual/thinkphp6_0/1118027

thinkphp6.0废弃了压缩包官网下载,只能使用composer安装。
安装命令:

composer create-project topthink/think tp

composer的安装链接:
https://www.runoob.com/w3cnote/composer-install-and-usage.html

1、thinkphp 默认是有index.php 的。去掉index.php要更改public/下的.htaccess文件

phpstudy的Apache环境配置代码


 Options +FollowSymlinks -Multiviews
 RewriteEngine On

 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]

2、thinkphp默认是单应用模式,也就是下面的目录结构。
├─app 应用目录
│  ├─controller         控制器目录
│  ├─model              模型目录
│  ├─view               视图目录
│  └─ ...               更多类库目录

如果要使用多应用模式

├─app 应用目录
│  ├─index              主应用
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  ├─config          配置目录(优先)
│  │  └─ ...            更多类库目录
│  ├─admin               后台应用
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  ├─config          配置目录(优先)
│  │  └─ ...            更多类库目录

则需要在config/app.php 中进行配置开启多应用模式。config文件夹可以单独放在应用目录下,比如admin/config

   // 自动多应用模式
    'auto_multi_app'   => true,

否则则会报错控制器不存在。

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

composer require topthink/think-multi-app

注:多应用模式部署后,记得删除app目录下的controller目录(系统根据该目录作为判断是否单应用的依据)。

3、要使用视图的样式路径替换,如下这种

则需要在config/view.php 中进行配置。config文件夹以及配置文件,可以单独放在应用目录下。比如admin/config。目录设置方法是使用tpl_replace_string关键字。

image.png

注:由于thinkphp中的视图使用的是静态加载,所以需要更改html文件才会重新加载。更改模板路径后出现样式不加载的问题,可以修改html文件后再刷新

// +----------------------------------------------------------------------
// | 模板设置
// +----------------------------------------------------------------------

return [
    // 模板路径输出替换
    'tpl_replace_string' => [
        '__STATIC__' => '/static/',
        '__CSS__' => '/static/css/',
        '__JS__' => '/static/js/',
        '__FONTS__' => '/static/fonts/',
        '__IMAGES__' => '/static/images/',
        '__PLUGS__' => '/static/plugs/',
        '__SYSTEM__' => '/system/',
        '__LOGIN__' => '/system/login/',

    ],
];
4、thinkPHP6.0 中的$this->success$this->error$this->redirect等报错问题

thinkPHP6.0 取消掉了think\Controller类,系统不再提供基础控制器类think\Controller,而原来的successerrorredirectresult方法也一起没有了,需要自行定义。默认可在系统提供的app/BaseController.php文件里面定义。

/***
     * @param mixed ...$args
     *间单重定向方法
     *
     */
    protected function redirect(...$args){
        throw new HttpResponseException(redirect(...$args));
    }

    /***
     * 成功提示跳转方法
     *
     * @param string $msg 提示信息
     * @param string $data  返回的数据
     * @param array $header 发送的Header信息
     * @throws HttpRequestException
     *
     *
     */
    protected function success($msg='',$data='',array $header=[])
    {
        $code   = 1;
        $result = [
            'code' => $code,
            'msg'  => $msg,
            'data' => $data,
        ];
        $type                                   = 'json';
        $header['Access-Control-Allow-Origin']  = '*';
        $header['Access-Control-Allow-Headers'] = 'X-Requested-With,Content-Type,XX-Device-Type,XX-Token,XX-Api-Version,XX-Wxapp-AppId';
        $header['Access-Control-Allow-Methods'] = 'GET,POST,PATCH,PUT,DELETE,OPTIONS';
        $response                               = Response::create($result, $type)->header($header);
        throw new HttpRequestException($response);
    }

    /**
     *
     * 错误跳转提示方法
     * @param string $msg 提示信息,若要指定错误码,可以传数组,格式为['code'=>您的错误码,'msg'=>'您的错误消息']
     * @param string $data  返回的数据
     * @param array $header 发送的Header信息
     * @throws HttpResponseException
     *
     */
    protected function error($msg = '', $data = '', array $header = [])
    {
        $code = 0;
        if (is_array($msg)) {
            $code = $msg['code'];
            $msg  = $msg['msg'];
        }
        $result = [
            'code' => $code,
            'msg'  => $msg,
            'data' => $data,
        ];

        $type                                   = $this->getResponseType();
        $header['Access-Control-Allow-Origin']  = '*';
        $header['Access-Control-Allow-Headers'] = 'X-Requested-With,Content-Type,XX-Device-Type,XX-Token,XX-Api-Version,XX-Wxapp-AppId';
        $header['Access-Control-Allow-Methods'] = 'GET,POST,PATCH,PUT,DELETE,OPTIONS';
        $response                               = Response::create($result, $type)->header($header);
        throw new HttpResponseException($response);
    }





5、使用模型时,模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写。
模型名 约定对应数据表(假设数据库的前缀定义是 think_)
User think_user
UserType think_user_type

5.1、如果你想指定数据表甚至数据库连接的话,可以单独设置:

注:table名必须是包含前缀在内的完整表名

6、获取请求变量

系统推荐使用param方法统一获取当前请求变量,该方法最大的优势是让你不需要区分当前请求类型而使用不同的全局变量或者方法,并且可以满足大部分的参数需求,下面举一个例子。

param());
        echo 'name:'.$request->param('name');
    }
}
7、thinkphp6.0 取消掉了success、error、redirect、result 等跳转函数。需要在app/BaseController.php 中自行定义。如果不想自己写,下面链接有对应封装好的方法可以直接用。

https://github.com/liliuwei/thinkphp-jump

8、session的使用之前需要初始化开启session。

开启session的方法是通过在全局的中间件定义文件中去定义。也就是在app/middleware.php 文件中,去掉session 初始化的注释。

// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
     \think\middleware\SessionInit::class,
    // 页面Trace调试
    // \think\middleware\TraceDebug::class,
];
9、thinkphp6.0 2019-10-24 正式版发布后,命令php think build demo报错。

最新版本把多应用模式独立为框架的一个全局中间件扩展了。
要使用:

composer require topthink/think-multi-app

进行多应用的扩展安装。安装后路由访问没问题,但是使用命令

php think build demo

会报 Command "build" is not defined.
这时候需要在app.php 添加

// 自动多应用模式
'auto_multi_app' => true,

开启自动多应用才能使用,然后自带的controller文件也必须删除,才能够使用。

10、thinkphp6.0 2019-10-24 正式版发布后。View::fetch() 报错Driver [Think] not supported

这是view的驱动没有安装,使用命令

composer require topthink/think-view

安装后就可以了。

11、Thinkphp开发时如何关闭缓存
在6.0正式版中 关闭缓存需要把根目录下面.example.env 更名为.env。然后在里面添加相应字段。

'TMPL_CACHE_ON'=>false,      // 默认开启模板缓存

TMPL_CACHE_ON'   => false,  // 默认开启模板编译缓存 false 的话每次都重新编译模板

'ACTION_CACHE_ON'  => false,  // 默认关闭Action 缓存

'HTML_CACHE_ON'   => false,   // 默认关闭静态缓存

关闭全部缓存

APP_DEBUG=>true 

DB_FIELD_CACHE=>false 

HTML_CACHE_ON=>false
12、关于路由Route::buildUrl生成url的问题

Route::buildUrl()这个法生成url地址,会返回一个think\route\Url对象实例。因为使用了__toString方法。可以echo输出,但不能直接在静态模板中使用。
如果是通过数据返回客户端(比如用ajax异步请求,或者axios 请求数据等),则需要先强制转换为字符串类型后再返回。

$url = (string) \think\facade\Route::buildUrl();
13、thinkphp6----延迟生效解决办法

使用thinkphp6开发项目,发现一个很神奇的问题,修改控制器后,会出现30秒的延迟,才能生效。
这个不是thinkphp6框架的问题,是PHP7.x的问题,关闭opchche就行。
找到php.ini下的opchche拓展:

opcache.enable = 1
image.png
14、多应用注册路由

1、建议开启强制路由打开config/route.php

url_route_must =>ture

2.配置应用(api)路由,文件位置:app\api\route.php
route.php文件需要自己创建。使用资源路由

Route::resource('blog', 'Blog');

2.配置路由映射 config/app.php

'app_map' => [
'think' => 'admin', // 把admin应用映射为think
],
多应用使用的路由使用的一些小问题总结

如果要使用多应用模式,你需要安装多应用模式扩展think-multi-app。这个上面有,就不多赘述

1、要使用路由,首先得开启路由(路由默认是开启的,如果报错还是得检查)。文件位置config/app.php

    // 是否启用路由
    'with_route'       => true,

2、多应用的访问路径。如果没有把对应应用设置为默认访问,则一般是域名加多应用文件名。比如admin
访问路径为:localhost/admin+控制方法。设置了默认访问后才能直接域名访问。而对应的其他,也是需要加文件名的。
设置默认访问的方法。

  • A、入口文件绑定应用。在public/index.php中修改
// [ 应用入口文件 ]
namespace think;

require __DIR__ . '/../vendor/autoload.php';

// 执行HTTP应用并响应
$http = (new App())->http;

//$response = $http->run(); //源代码
// 指定应用目录为admin
$response = $http->name('admin')->run();
$response->send();

$http->end($response);
  • B、设置默认应用名称。
// 默认应用
'default_app'    =>    'admin',
// 开启应用快速访问
'app_express'    =>    true,

注: 设置默认应用名称,一般会跟着开启快速访问。

  • C、子域名绑定应用。这个是能多个应用同时直接域名访问的方法,而不受默认方法限制。
    1)、配置hosts:C:\Windows\System32\drivers\etc\hosts
127.0.0.1 web.test.com
127.0.0.1 admin.test.com

2)、apache 虚拟主机配置文件,先保证两个域名都能访问当前项目


    DocumentRoot "E:\www\thinkphp\tp6\public"
    ServerName web.test.com
    ServerAlias admin.test.com

3)、修改配置文件:config/app.php,添加域名绑定

键名:liang 代表当前域名的二级域名前缀,即 liang.tp6.cy
键值:index 代表应用名
以下配置作用:将二级域名 liang.tp6.cy 绑定到 index应用

'app_map' => [
    ' web.test.com' =>  'home',  
    'admin.test.com'  =>  'admin',  
],

3、路由定义必须在当前的应用下。
我们知道ThinkPHP5的时候,我们可以在根目录下的路由文件定义,但是ThinkPHP6后必须在应用目录下定义路由。也就是,比如你的多应用是admin。它的目录结构应该是如下的。

├─app 应用目录
│  ├─admin              后台应用
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  ├─config          配置目录
│  │  ├─route           路由目录
│  │  │  ├─route.php    路配置文件

然后才是配置,route.php
注: route 文件下thinphp 是自动加载的。所以不一定要命名为route.php,也可以是api.php 反正随意。

如果你设置了admin 为默认访问。则访问地址就是 web.test.com/mythink
如果不是,则你就需要添加admin。 用web.test.com/admin/mythink 访问。

14、 关于thinkphp6 initialize() 初始化的小问题。

thinkphp6 的可以不需要继承controller 就能使用。但是如需要使用initialize()方法,还是需要继承。tp6 的controller 被改成了 app/BaseController.php 文件。以进行一些初始化的操作。
示例代码

你可能感兴趣的:(2019-09-20 thinkphp6.0 踩坑)