首頁 > php框架 > ThinkPHP > 主體

thinkphp6教學筆記(總結分享)

WBOY
發布: 2022-05-07 14:07:51
轉載
4314 人瀏覽過

這篇文章為大家帶來了關於PHP的相關知識,其中主要總結了一些筆記知識點,包括了模型、系統服務、laket-admin專案等內容,下面一起來看一下,希望對大家有幫助。

thinkphp6教學筆記(總結分享)

推薦學習:《PHP影片教學

安裝

thinkphp6教學筆記(總結分享)
記得加路徑或(全路徑)php (全路徑)composer.phar 指令的方式運行。避免php版本問題==
thinkphp6教學筆記(總結分享)
若要開啟多應用,必須使用 composer require topthink/think-multi-app 安裝多應用程式拓展! !

thinkphp6教學筆記(總結分享)
這中方式啟動的是php的內建伺服器 所以如果nginx設定了這個連接埠號碼 啟動不起來 。
這個只用於測試 平常還是用nginx的好。而且可以把目錄指定為public目錄,這樣直接 ip:1000 就能存取到了 。但是會不會php使用info的時候 根目錄出錯?

另外安裝composer的時候不要從小皮面板安裝坑貨······

且需要更改php命令行的版本或好像curl -sS https://getcomposer .org/installer | php 這個指令改最後一個參數為安裝路徑就行?
然後php8.0要安裝zip拓展 直接小皮面板會報錯 要手動安裝 ==都是坑
】不用小皮就不會遇到這些問題!

大坑==

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
thinkphp6教學筆記(總結分享)

配置

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

![thinkphp6教學筆記(總結分享)](https://img-blog.csdnimg.cn/ecc6a4984a234f61b60138f916501197.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LqR6Zey5LiN5pS2,size_20,color_FFFFFF,t_70,g_se,x_16

應用目錄

thinkphp6教學筆記(總結分享)

輸出

thinkphp6教學筆記(總結分享)
陣列不能直接用return

控制器

兩個特殊的控制器

一.基礎控制器

  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 ‘当前控制器不存在!’;
     }
     }
    登入後複製

模型

遊標的意義

thinkphp6教學筆記(總結分享)

#驗證器

使用

例如, 在TP3的時候, 可能是這樣判斷的:

$name = I('name', '');if (empty($name)) {
    // 抛出异常}
登入後複製

如果參數比較多的時候, 需要判斷的變數越多程式碼量也隨著增加. 如果使用驗證器就會好很多.

驗證器的官方文件: https://www.kancloud.cn/manual/thinkphp6_0/1037624

直接上碼:

<?php
 namespace app\api\controller;
 use think\facade\Validate;use think\Request;
 class Auth{
    public function index(Request $request)
    {
        $input = $request->post();
        $validate = Validate::rule([
                &#39;name|名称&#39;  => &#39;require|max:25&#39;,
                &#39;email|邮箱&#39; => &#39;require|email&#39;
            ]);
 
        if (!$validate->check($input)) {
            return $validate->getError();
        }
    }}
登入後複製

thinkphp6教學筆記(總結分享)

#驗證的好處

主要是重複使用而且直接輸出錯誤訊息避免重複寫程式碼

系统服务

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

使用 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 估计不太适合你。

最后,Service 的具体实践有没有什么好的项目推荐啊,那当然有的,这里隆重推荐一个完全使用 Service 开发的项目:

laket-admin: https://github.com/deatil/laket-admin

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

laket-admin项目的截图

为什么halt

thinkphp6教學筆記(總結分享)

依赖注入与容器

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

如何注入

首先是构造器注入

api/manager/TestMgr.php

namespace app\api\manager;class TestMgr{
    public string $name1 = &#39;a&#39;;}
登入後複製
登入後複製

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 = &#39;a&#39;;}
登入後複製
登入後複製

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([&#39;类名&#39;,&#39;方法名&#39;])
登入後複製
$bar = new Bar(); $foo = new Foo($bar);等价于$foo = invoke(&#39;Foo&#39;);
登入後複製

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

$result = invoke(function(Bar $bar) {
    // ...});
登入後複製

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

什么是容器

thinkphp6教學筆記(總結分享)
ThinkPHP使用容器来更方便的管理【类依赖】及【运行依赖注入】
thinkphp6教學筆記(總結分享)
thinkphp6教學筆記(總結分享)

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

app助手函数

thinkphp6教學筆記(總結分享)

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

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

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

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

bind

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

// 绑定类库标识bind(&#39;user&#39;,&#39;\app\index\model\User&#39;);// 快速调用(自动实例化)echo app(&#39;user&#39;)->name;
登入後複製

更多bind的用法看手册

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

provider.php

一般来说,bind只能在定义的那个地方用,其他地方就用不了了。所以,为了其他地方也能用,我们将bind函数写在provider.php文件中
thinkphp6教學筆記(總結分享)

容器的好处

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

容器自动依赖注入

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

自定义实例化

thinkphp6教學筆記(總結分享)

其他

thinkphp6教學筆記(總結分享)

场景

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

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

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

Facade 门面模式

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

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

thinkphp6教學筆記(總結分享)
facade目录 和外面是对应的

thinkphp6教學筆記(總結分享)

推荐学习:《PHP视频教程

以上是thinkphp6教學筆記(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板