溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

thinkphp6安裝的坑怎么解決

發(fā)布時(shí)間:2022-05-10 15:24:22 來源:億速云 閱讀:188 作者:iii 欄目:編程語言

這篇文章主要介紹“thinkphp6安裝的坑怎么解決”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“thinkphp6安裝的坑怎么解決”文章能幫助大家解決問題。

大坑==

phpstudy 網(wǎng)站那 要關(guān)了open_dir 防止跨站攻擊的 不然設(shè)置public目錄為 網(wǎng)站根目錄后 就訪問不到外面的
如果php_ini中設(shè)置了 也關(guān)了 或者設(shè)置下正常目錄
nginx中 和fastcgi.conf里可能也有這個(gè)設(shè)置

然后 要開啟php的
display_errors = On
display_startup_errors = On

默認(rèn)是不開啟的==
這個(gè) 即使沒開 框架也能報(bào)錯(cuò) 可能是因?yàn)樵O(shè)置了iniset的 但是框架要正常啟動(dòng)了才有效。否則比如遇到的500錯(cuò)誤 框架根本沒啟動(dòng)起來 自然也就顯示不了報(bào)錯(cuò)了

另外 如果是拷貝的文件 權(quán)限可能也要設(shè)置下 為755

env也要開啟debug

然后runtime目錄設(shè)置為777

基礎(chǔ)

錯(cuò)誤顯示

除了上面的大坑外,一般是設(shè)置env

配置

[DATABASE]USERNAME =  rootPASSWORD =  123456
use think\facade\Envfunction(){// 獲取環(huán)境變量 如果不存在則使用默認(rèn)值rootEnv::get('database.username', 'root');}

控制器

兩個(gè)特殊的控制器

一. 基礎(chǔ)控制器

  1. 一般來說,創(chuàng)建控制器后,推薦繼承基礎(chǔ)控制器來獲得更多的方法;

  2. 基礎(chǔ)控制器僅僅提供了控制器驗(yàn)證功能,并注入了think\App和think\Request;

  3. 這兩個(gè)對(duì)象后面會(huì)有章節(jié)詳細(xì)講解,下面我們繼承并簡單使用一下;

    二. 空控制器

  4. namespace app\controller;
     use app\BaseController;
     class Test extends BaseController
     {
     public function index()
     {
     //返回實(shí)際路徑
     return $this->app->getBasePath();
     //返回當(dāng)前方法名
     return $this->request->action();
     }
     }
  5. 在單應(yīng)用模式下,我們可以給項(xiàng)目定義一個(gè) Error 控制器類,來提醒錯(cuò)誤;

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

模型

游標(biāo)的意義

驗(yàn)證器

使用

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

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

如果參數(shù)比較多的時(shí)候, 需要判斷的變量越多代碼量也隨著增加. 如果使用驗(yàn)證器就會(huì)好很多.

直接上代碼:

<?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([
                'name|名稱'  => 'require|max:25',
                'email|郵箱' => 'require|email'
            ]);
 
        if (!$validate->check($input)) {
            return $validate->getError();
        }
    }}

驗(yàn)證的好處

主要是 重復(fù)使用 而且直接輸出錯(cuò)誤信息 避免重復(fù)寫代碼

系統(tǒng)服務(wù)

使用系統(tǒng)服務(wù)有大大的好處和避免了直接修改類的壞處。從以上分析來看,個(gè)人覺得,使用系統(tǒng)服務(wù),可以對(duì)一個(gè)類進(jìn)行非入侵式的「配置」,如果哪天一個(gè)類的某些設(shè)定需要修改,我們不用直接修改這個(gè)類,只需要修改服務(wù)提供類就好了。對(duì)于擴(kuò)展包來說,系統(tǒng)服務(wù)使其可以在擴(kuò)展中靈活配置程序,達(dá)到開箱即用的效果。不過,有個(gè)缺點(diǎn)是系統(tǒng)服務(wù)類都要在程序初始化是進(jìn)行實(shí)例化,如果一個(gè)系統(tǒng)的服務(wù)類很多,勢必影響程序的性能。

使用 thinkphp 開發(fā)網(wǎng)站,在沒有 thinkphp6 版本出來以前,常規(guī)的開發(fā)模式都是使用它自帶的多應(yīng)用開發(fā)方式來進(jìn)行項(xiàng)目開發(fā)。

多應(yīng)用開發(fā)的一個(gè)好處就是開發(fā)方便和快速,只需要在thinkphp規(guī)定的app目錄建立一個(gè)目錄,比如 admin 目錄,然后在其內(nèi)建立一個(gè) controller 目錄就可以開始一個(gè)項(xiàng)目的基本開發(fā)了。

然而這樣開發(fā)只適合基于它本身的目錄進(jìn)行開發(fā),如果想要把項(xiàng)目做成一個(gè)包來開發(fā)和發(fā)布,這樣的方式明顯不行。

而這次,thinkphp6 引入了 Service 的概念,增加了項(xiàng)目轉(zhuǎn)移到包開發(fā)的可能性。

Service 的使用需要繼承 \think\Service ,同時(shí) Service 默認(rèn)的 register 和 boot 這兩個(gè)方法是非必須的,就是說可以不用添加也是可以的。

但是,我們使用 Service 就是為了在項(xiàng)目啟動(dòng)前添加自己的配置和注冊一些自己的東西,所以這兩個(gè)方法對(duì)項(xiàng)目開發(fā)來說,都利用起來是最好的方法。

register的使用
register 的加載要先于 boot 方法,也同時(shí)在系統(tǒng)里屬于提前注冊一些具體的配置及綁定類,所以在具體的項(xiàng)目開發(fā)中,也是推薦只做一些項(xiàng)目的配置。

Service 的引入會(huì)根據(jù) thinkphp6 生成的 Services.php 緩存順序進(jìn)行加載,所以在使用過程中需要注意當(dāng)前的 Service 在緩存中屬于哪個(gè)位置,防止在注冊配置時(shí)候出現(xiàn)配置加載時(shí)出現(xiàn)不可知的問題。

boot 的使用
boot 通常是在 register 注冊完成后進(jìn)行加載,boot 方法里推薦做一些對(duì) register 注冊完成后的信息的補(bǔ)充處理。

thinkphp6 由于在 boot 前已做了系統(tǒng)配置的初始化操作,所以在這里處理一些數(shù)據(jù)庫操作也是沒有問題的。

Service 的其他方法
loadRoutesFrom :導(dǎo)入路由,傳入數(shù)據(jù)為匿名函數(shù)

registerRoutes :功能于 loadRoutesFrom 一樣

commands :導(dǎo)入腳本命令,傳入數(shù)據(jù)為數(shù)組或者單個(gè)腳本

使用 Service 的場景
如果你想要把一個(gè)項(xiàng)目獨(dú)立成一個(gè)包進(jìn)行發(fā)布或者為 thinkphp6 提供擴(kuò)展包。

如果只是單純的想做一個(gè) app 項(xiàng)目,Service 估計(jì)不太適合你。

laket-admin 使用 thinkphp6 的 Service 模式加單應(yīng)用開發(fā)而成,避開了 thinkphp6 多應(yīng)用下 url 出現(xiàn)的一些問題,對(duì)用戶端的 url 更加友好。

laket-admin項(xiàng)目的截圖

為什么halt

依賴注入與容器

依賴注入其實(shí)本質(zhì)上是指對(duì)類的依賴通過構(gòu)造器完成自動(dòng)注入,例如在控制器架構(gòu)方法和操作方法中一旦對(duì)參數(shù)進(jìn)行對(duì)象類型約束則會(huì)自動(dòng)觸發(fā)依賴注入,由于訪問控制器的參數(shù)都來自于URL請求,普通變量就是通過參數(shù)綁定自動(dòng)獲取,對(duì)象變量則是通過依賴注入生成。

如何注入

首先是構(gòu)造器注入

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;
    }

構(gòu)造器方法注入的解析

如果換成我們手動(dòng)調(diào)用的方式,那么正常的流程應(yīng)該是

$testMgr = new TestMgr();//多出來了這一步 要先實(shí)例化TestMgr$test = new Test($testMgr);$test->index($testMgr);

然而 瀏覽器直接調(diào)用的方式是 ,因?yàn)?正常情況下 不可能我們接口調(diào)用 還去 先new一堆東西吧

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

但這樣肯定會(huì)報(bào)錯(cuò) 因?yàn)?構(gòu)造器有參數(shù) 但是你沒傳。所以我們不能直接這么寫,要寫成上面那種自動(dòng)注入的參數(shù)的形式。而事實(shí)上 我們也可以通過invoke函數(shù)來完成遞歸實(shí)例化這一操作。

所以,相當(dāng)于容器自動(dòng)幫我們完成了這個(gè)操作。我們要做的 只是在方法的參數(shù)中寫需要的那個(gè)類的即可 不需要去手動(dòng)去new底層的一堆對(duì)象

方法調(diào)用的方式

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

//使用容器來實(shí)例化的話,可以自動(dòng)進(jìn)行依賴注入。invoke(類名)//某個(gè)方法依賴注入invoke(['類名','方法名'])
$bar = new Bar(); $foo = new Foo($bar);等價(jià)于$foo = invoke('Foo');

也支持對(duì)某個(gè)函數(shù)或者閉包使用依賴注入

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

上面的實(shí)現(xiàn)-------容器

什么是容器


ThinkPHP使用容器來更方便的管理【類依賴】及【運(yùn)行依賴注入】

簡而言之,容器內(nèi)部是通過反射類或閉包等來實(shí)現(xiàn)類的實(shí)例化(單例)。
容器并非只能用于依賴注入
//官方說明:容器中已經(jīng)調(diào)用過的類會(huì)自動(dòng)使用單例,除非你使用下面的方式強(qiáng)制重新實(shí)例化。
// 每次調(diào)用都會(huì)重新實(shí)例化->$cache = app(‘user’,true);

app助手函數(shù)

$arrayItem = app(‘org\utils\ArrayItem’);
上述代碼會(huì)判斷在容器中是否存在這個(gè)單例,如果有就直接返回,沒有就幫我們自動(dòng)創(chuàng)建一個(gè)這個(gè)類的單例然后返回。
比如:
echo app(‘user’)->name;

注釋:new是寫死的 而上面是字符串 可以動(dòng)態(tài)解析的!!

app和invoke這兩個(gè)助手函數(shù)的區(qū)別

app 快速獲取容器中的實(shí)例 支持依賴注入
invoke 調(diào)用反射執(zhí)行callable 支持依賴注入

bind

依賴注入的類統(tǒng)一由容器進(jìn)行管理,大多數(shù)情況下是在自動(dòng)綁定并且實(shí)例化的。不過你可以隨時(shí)進(jìn)行手動(dòng)綁定類到容器中(通常是在服務(wù)類的register方法中進(jìn)行綁定),支持多種綁定方式。
bind就是給實(shí)例起一個(gè)別名 方便app快速調(diào)用

// 綁定類庫標(biāo)識(shí)bind('user','\app\index\model\User');// 快速調(diào)用(自動(dòng)實(shí)例化)echo app('user')->name;

更多bind的用法看手冊

ps:bind 實(shí)際上是$this->app->bind(‘think\Cache’, ‘a(chǎn)pp\common\Cache’);的快捷調(diào)用
也叫助手函數(shù)

provider.php

一般來說,bind只能在定義的那個(gè)地方用,其他地方就用不了了。所以,為了其他地方也能用,我們將bind函數(shù)寫在provider.php文件中

容器的好處

容器:【“拿來即用”,不需要通過實(shí)例化,松耦,節(jié)約資源】

容器自動(dòng)依賴注入

容器主要用于依賴注入,依賴注入會(huì)首先檢查容器中是否注冊過該對(duì)象實(shí)例,如果沒有就會(huì)自動(dòng)實(shí)例化,然后自動(dòng)注入

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

控制器架構(gòu)方法;
控制器操作方法;
路由的閉包定義;
事件類的執(zhí)行方法;
中間件的執(zhí)行方法;

門面 face就大量使用了依賴注入

Facade 門面模式

看設(shè)計(jì)模式那個(gè)文檔。
tp中,說的直白一點(diǎn),F(xiàn)acade功能可以讓類無需實(shí)例化而直接進(jìn)行靜態(tài)方式調(diào)用。使用靜態(tài)方式調(diào)用非靜態(tài)方法時(shí)隱式的實(shí)例化了該類,無需額外的實(shí)例化工作(看最下面總結(jié) 因?yàn)橐獙?shí)例化的可能很多個(gè))。

簡單來說 就是request實(shí)際上是用依賴注入的方式寫的,所以需要實(shí)例化一大堆。所以要么使用門面模式 要么使用自動(dòng)依賴注入的方式調(diào)用!

關(guān)于“thinkphp6安裝的坑怎么解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI