当前位置:

首页 > 编程开发 > ThinkPHP6安装常见问题及解决办法

ThinkPHP6安装常见问题及解决办法

大坑==phpstudy网站那要关了open_dir防止跨站攻击的不然设置public目录为网站根目录后就访问不到外面的如果php_ini中设置了也关了或者设置下正常目录nginx中和fastcgi.conf里可能也有这个设置然后要开启php的display_errors=Ondisplay_startup_errors=On默认是不开启的==这个即使没开框架也能报错可能是因为设置了iniset的但是框架要正常启动了才有效。否则比如遇到的500错误框架根本没

本文目录

    大坑==

    phpstudy 网站那 要关了open_dir 防止跨站攻击的 不然设置public目录为 网站根目录后 就访问不到外面的
    如果php_ini中设置了 也关了 或者设置下正常目录
    nginx中 和fastcgi.conf里可能也有这个设置

    然后 要开启php的
    display_errors = On
    display_startup_errors = On

    默认是不开启的==
    这个 即使没开 框架也能报错 可能是因为设置了iniset的 但是框架要正常启动了才有效。否则比如遇到的500错误 框架根本没启动起来 自然也就显示不了报错了

    另外 如果是拷贝的文件 权限可能也要设置下 为755

    env也要开启debug

    然后runtime目录设置为777

    基础

    错误显示

    除了上面的大坑外,一般是设置env

    配置

    [DATABASE]USERNAME =  rootPASSWORD =  123456
    use think\facade\Envfunction(){// 获取环境变量 如果不存在则使用默认值rootEnv::get('database.username', 'root');}

    控制器

    两个特殊的控制器

    一. 基础控制器

    1. 一般来说,创建控制器后,推荐继承基础控制器来获得更多的方法;

    2. 基础控制器仅仅提供了控制器验证功能,并注入了think\App和think\Request;

    3. 这两个对象后面会有章节详细讲解,下面我们继承并简单使用一下;

      二. 空控制器

    4. namespace app\controller;
       use app\BaseController;
       class Test extends BaseController
       {
       public function index()
       {
       //返回实际路径
       return $this->app->getBasePath();
       //返回当前方法名
       return $this->request->action();
       }
       }
    5. 在单应用模式下,我们可以给项目定义一个 Error 控制器类,来提醒错误;

    6. class Error
       {
       public function index()
       {
       return ‘当前控制器不存在!’;
       }
       }

    模型

    游标的意义

    验证器

    使用

    例如, 在 TP3 的时候, 可能是这样判断的:

    $name = I('name', '');if (empty($name)) {
        // 抛出异常}

    如果参数比较多的时候, 需要判断的变量越多代码量也随着增加. 如果使用验证器就会好很多.

    直接上代码:

    post();
            $validate = Validate::rule([
                    'name|名称'  => 'require|max:25',
                    'email|邮箱' => 'require|email'
                ]);
     
            if (!$validate->check($input)) {
                return $validate->getError();
            }
        }}

    验证的好处

    主要是 重复使用 而且直接输出错误信息 避免重复写代码

    系统服务

    使用系统服务有大大的好处和避免了直接修改类的坏处。从以上分析来看,个人觉得,使用系统服务,可以对一个类进行非入侵式的「配置」,如果哪天一个类的某些设定需要修改,我们不用直接修改这个类,只需要修改服务提供类就好了。对于扩展包来说,系统服务使其可以在扩展中灵活配置程序,达到开箱即用的效果。不过,有个缺点是系统服务类都要在程序初始化是进行实例化,如果一个系统的服务类很多,势必影响程序的性能。

    使用 thinkphp 开发网站,在没有 thinkphp6 版本出来以前,常规的开发模式都是使用它自带的多应用开发方式来进行项目开发。

    多应用开发的一个好处就是开发方便和快速,只需要在thinkphp规定的app目录建立一个目录,比如 admin 目录,然后在其内建立一个 controller 目录就可以开始一个项目的基本开发了。

    然而这样开发只适合基于它本身的目录进行开发,如果想要把项目做成一个包来开发和发布,这样的方式明显不行。

    而这次,thinkphp6 引入了 Service 的概念,增加了项目转移到包开发的可能性。

    Service 的使用需要继承 \think\Service ,同时 Service 默认的 register 和 boot 这两个方法是非必须的,就是说可以不用添加也是可以的。

    但是,我们使用 Service 就是为了在项目启动前添加自己的配置和注册一些自己的东西,所以这两个方法对项目开发来说,都利用起来是最好的方法。

    register的使用
    register 的加载要先于 boot 方法,也同时在系统里属于提前注册一些具体的配置及绑定类,所以在具体的项目开发中,也是推荐只做一些项目的配置。

    Service 的引入会根据 thinkphp6 生成的 Services.php 缓存顺序进行加载,所以在使用过程中需要注意当前的 Service 在缓存中属于哪个位置,防止在注册配置时候出现配置加载时出现不可知的问题。

    boot 的使用
    boot 通常是在 register 注册完成后进行加载,boot 方法里推荐做一些对 register 注册完成后的信息的补充处理。

    thinkphp6 由于在 boot 前已做了系统配置的初始化操作,所以在这里处理一些数据库操作也是没有问题的。

    Service 的其他方法
    loadRoutesFrom :导入路由,传入数据为匿名函数

    registerRoutes :功能于 loadRoutesFrom 一样

    commands :导入脚本命令,传入数据为数组或者单个脚本

    使用 Service 的场景
    如果你想要把一个项目独立成一个包进行发布或者为 thinkphp6 提供扩展包。

    如果只是单纯的想做一个 app 项目,Service 估计不太适合你。

    laket-admin 使用 thinkphp6 的 Service 模式加单应用开发而成,避开了 thinkphp6 多应用下 url 出现的一些问题,对用户端的 url 更加友好。

    laket-admin项目的截图

    为什么halt

    依赖注入与容器

    依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。

    如何注入

    首先是构造器注入

    api/manager/TestMgr.php

    namespace app\api\manager;class TestMgr{
        public string $name1 = 'a';}

    api/controller/Test.php

    class Test{
        public function __construct(TestMgr $testMgr){
            $this->testMgr=$testMgr;
        }
    
        public function index()
        {
            return $this->testMgr->name1; //输出a
            //same as $a=new TestMgr();return $a->name;
        }

    构造器方法注入的解析

    如果换成我们手动调用的方式,那么正常的流程应该是

    $testMgr = new TestMgr();//多出来了这一步 要先实例化TestMgr$test = new Test($testMgr);$test->index($testMgr);

    然而 浏览器直接调用的方式是 ,因为 正常情况下 不可能我们接口调用 还去 先new一堆东西吧

    $test = new Test();$test->index($testMgr);

    但这样肯定会报错 因为 构造器有参数 但是你没传。所以我们不能直接这么写,要写成上面那种自动注入的参数的形式。而事实上 我们也可以通过invoke函数来完成递归实例化这一操作。

    所以,相当于容器自动帮我们完成了这个操作。我们要做的 只是在方法的参数中写需要的那个类的即可 不需要去手动去new底层的一堆对象

    方法调用的方式

    api/manager/TestMgr.php

    namespace app\api\manager;class TestMgr{
        public string $name1 = 'a';}

    api/controller/Test.php

    namespace app\api\controller;use app\api\manager\TestMgr;class Test{
        public function index(TestMgr $testMgr)
        {
            return $testMgr->name1;//1
        }}

    invoke

    //使用容器来实例化的话,可以自动进行依赖注入。invoke(类名)//某个方法依赖注入invoke(['类名','方法名'])
    $bar = new Bar(); $foo = new Foo($bar);等价于$foo = invoke('Foo');

    也支持对某个函数或者闭包使用依赖注入

    $result = invoke(function(Bar $bar) {
        // ...});

    上面的实现-------容器

    什么是容器


    ThinkPHP使用容器来更方便的管理【类依赖】及【运行依赖注入】

    简而言之,容器内部是通过反射类或闭包等来实现类的实例化(单例)。
    容器并非只能用于依赖注入
    //官方说明:容器中已经调用过的类会自动使用单例,除非你使用下面的方式强制重新实例化。
    // 每次调用都会重新实例化->$cache = app(‘user’,true);

    app助手函数

    $arrayItem = app(‘org\utils\ArrayItem’);
    上述代码会判断在容器中是否存在这个单例,如果有就直接返回,没有就帮我们自动创建一个这个类的单例然后返回。
    比如:
    echo app(‘user’)->name;

    注释:new是写死的 而上面是字符串 可以动态解析的!!

    app和invoke这两个助手函数的区别

    app 快速获取容器中的实例 支持依赖注入
    invoke 调用反射执行callable 支持依赖注入

    bind

    依赖注入的类统一由容器进行管理,大多数情况下是在自动绑定并且实例化的。不过你可以随时进行手动绑定类到容器中(通常是在服务类的register方法中进行绑定),支持多种绑定方式。
    bind就是给实例起一个别名 方便app快速调用

    // 绑定类库标识bind('user','\app\index\model\User');// 快速调用(自动实例化)echo app('user')->name;

    更多bind的用法看手册

    ps:bind 实际上是$this->app->bind(‘think\Cache’, ‘app\common\Cache’);的快捷调用
    也叫助手函数

    provider.php

    一般来说,bind只能在定义的那个地方用,其他地方就用不了了。所以,为了其他地方也能用,我们将bind函数写在provider.php文件中

    容器的好处

    容器:【“拿来即用”,不需要通过实例化,松耦,节约资源】

    容器自动依赖注入

    容器主要用于依赖注入,依赖注入会首先检查容器中是否注册过该对象实例,如果没有就会自动实例化,然后自动注入

    支持使用依赖注入的场景包括(但不限于):

    控制器架构方法;
    控制器操作方法;
    路由的闭包定义;
    事件类的执行方法;
    中间件的执行方法;

    门面 face就大量使用了依赖注入

    Facade 门面模式

    看设计模式那个文档。
    tp中,说的直白一点,Facade功能可以让类无需实例化而直接进行静态方式调用。使用静态方式调用非静态方法时隐式的实例化了该类,无需额外的实例化工作(看最下面总结 因为要实例化的可能很多个)。

    简单来说 就是request实际上是用依赖注入的方式写的,所以需要实例化一大堆。所以要么使用门面模式 要么使用自动依赖注入的方式调用!

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 thinkphp
    相关文章 更多
    thinkphp写接口代码的完整开发实例教程
    thinkphp写接口代码的完整开发实例教程

    本教程以ThinkPHP框架为例,通过文章管理API的具体业务场景,详细拆解路由定义、数据验证、控制器逻辑、数据模型操作、统一响应结构与全局异常处理的完整接口开发全流程。

    thinkphp项目部署指南详解服务器部署步骤
    thinkphp项目部署指南详解服务器部署步骤

    详细解析ThinkPHP项目在Linux服务器上的部署步骤,包括环境搭建、文件权限、Nginx配置及常见陷阱,提供可复制的代码示例与例外场景分析。

    为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】
    为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】

    ThinkPHP6.0模型关联返回null的常见原因包括:with闭包遗漏外键和主键字段、嵌套预加载语法不兼容低版本、关联方法内部误用with或field导致数据失控,以及全局作用域与软删除未显式处理。通过检查SQL日志、显式声明关键字段、升级版本或改用正确语法、清理关联方法中的查询条件即可解决。

    TP6.0 构建支持断点续传的超大附件上传服务【分片】
    TP6.0 构建支持断点续传的超大附件上传服务【分片】

    在ThinkPHP6.0中实现支持断点续传的超大附件上传,采用分片上传方案。前端按2MB切片并生成唯一chunkId,通过GET请求校验已传分片,用localStorage持久化上传状态。后端控制器接收分片存储,创建upload_status表管理进度,合并时加文件锁并校验MD5,确保生产环境下的可靠性与性能。

    thinkphp排序怎么实现动态排序 开发技巧解析
    thinkphp排序怎么实现动态排序 开发技巧解析

    动态排序时,order()应置于查询链式调用中且必须在paginate()之前;字段和方向需通过白名单硬校验,使用数组语法防SQL注入;分页调用appends()传递参数;多字段排序用关联数组,确保安全稳定。

    TP6.0 复杂业务逻辑下事务嵌套的回滚陷阱【DBA】
    TP6.0 复杂业务逻辑下事务嵌套的回滚陷阱【DBA】

    在复杂业务逻辑中,事务嵌套的回滚问题一直是ThinkPHP开发者容易踩的坑,尤其是TP6.0版本。先说核心结论:TP6.0并不支持真正意义上的嵌套事务。很多人以为调用两次Db::transaction()就能在内部自动管理回滚,实际上这只是一层“伪装”——内层事务的提交或回滚操作会被直接忽略,异常也

    thinkphp排序怎么实现倒序排列 教程简单易懂
    thinkphp排序怎么实现倒序排列 教程简单易懂

    ThinkPHP 实现倒序排列,说穿了就是 order() 方法配合 desc 方向,一句话的事儿,根本不需要什么复杂的循环或额外逻辑。 来看看最直接的方式:用 order('字段名 desc') 搞定。这招的好处是数据库层直接干活,效率高,逻辑也清晰。比如你想让文章列表按照发布时间从新到旧排,那就

    TP5.1 项目接入 LDAP 实现后台管理员统一认证【企业】
    TP5.1 项目接入 LDAP 实现后台管理员统一认证【企业】

    在企业系统逐渐转向统一身份认证的背景下,ThinkPHP 5.1 项目接入 LDAP 实现后台管理员统一认证,是不少团队正在推进的标准化改造。核心思路并不复杂——把框架默认基于数据库的账号校验逻辑彻底换掉,让登录请求直接交给企业 LDAP 目录服务来完成验证。说白了,不是简单改个密码字段,而是要重构

    TP5.1 项目启用 HttpOnly 防范 XSS 攻击【安全头】
    TP5.1 项目启用 HttpOnly 防范 XSS 攻击【安全头】

    在基于TP5.1框架的项目开发中,通过全局配置Cookie的HTTP只读属性、手动设置特定Cookie、修改PHP配置文件强制会话Cookie启用HTTP只读属性,并结合跨站脚本攻击入口过滤,能够有效地防范跨站脚本攻击窃取Cookie,形成多层次纵深防御体系。

    thinkphp排序如何按创建时间排序 配置指南
    thinkphp排序如何按创建时间排序 配置指南

    ThinkPHP中按创建时间排序可通过order()方法实现,支持固定排序、多字段组合及带GET参数的动态排序。分页时需传递query参数保持页码。按天聚合可使用orderRaw()配合DATE_FORMAT函数。对于数组数据,可用array_multisort或usort结合strtotime进行排序。时间格式需统一。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。