ThinkPHP

前言

最近想用ThinkPHP開發一些東西。以前沒有使用框架開發過,從來都是一個文件一個文件地寫…emm…簡單記錄一下這中間我遇到的問題,不會詳細寫使用過程。

問題記錄

學習過程中最好還是參考官方的開發文檔。
理解各個文件目錄、各個文件大概是什麼結構、什麼作用。

  1. Applicationmodule。這兩個在開發文檔的 架構總覽 章節寫的很清楚了。我現在理解的情況是,應用可以包含多個模塊,而多個模塊最常見的形式是:管理員後臺和用戶界面。我目前要開發的網站不需要管理員後臺,所以其實是使用了單模塊,但是不知道之後會是什麼情況,所以仍然是使用多模塊配置。
    模塊裏面可以包含多個控制器,應該是實現不同類別的響應。每一種控制器中又可以包含多個方法。
    說這個,是因爲我剛開始寫的時候目錄搞錯了,我把所有的文件都當做是新的模塊來創建。正確的做法應該是把文件當做是新的控制器來創建。
    在這裏插入圖片描述
    如果理解有錯的話,之後再來改。

  2. 我下載的是v5.1,默認開啓了路由,比如要訪問Index控制器中的index方法,則urlhttp://xx.xx.xx.xx/public/index/Index/index。第一個index是模塊名,第二個index是控制器名,第三個index是方法名。

  3. 要在thinkphp中引入html模版…剛開始我還以爲要在Login.php裏面添加相應的html代碼…
    參考https://blog.csdn.net/qq_36370731/article/details/78053248。在模塊目錄下創建view子目錄,在控制器文件中使用$this->fetch(模版名)thinkphp會自動爲你加載模版的。目前還沒有出現需要在模版中配置參數啥的…這些開發文檔都有介紹,用到的話直接去找就ok。

  4. 如果配置了tpl_replace_string,發現不起作用,那可以去找thinkphp/library/think/view/driver/think.php中的tpl_cache,默認值爲true,改爲false

  5. 後面版本的thinkphpsession類放到了facade\session裏,所以如果直接使用Session::get()等函數的時候會提示 靜態方法不能這樣調用 這樣的錯誤。所以要在開頭引用use think\facade\Session就ok了。

    本來最開始的時候都是用的原生的php中的session,自己每次寫的。後來因爲要配置一下session文件的存儲路徑(我要在同一個服務器上搭兩個服務器,所以希望session文件存放位置分開),在config目錄下的session.php文件配置path參數之後發現不起作用…然後看到官方文檔裏的下圖內容,就決定還是換成用人家弄好的類好了,配置不起作用的問題也解決了。
    在這裏插入圖片描述

  6. 用了Session類之後,發現不知道怎麼獲取session_id,在網上查了一下,懶得仔細找了,最後是在thinkphp/library/think/Session.php文件中添加如下代碼:

 public function sid()
   {
       if (PHP_SESSION_ACTIVE != session_status()) {
           session_start();
       }
       return session_id();
   }

使用Session::sid()即可獲取session_id

開發了一些東西了,感覺確實是用框架好很多,少掉很多自己要做的事情。

ThinkPHP與OAuth

我需要基於thinkphp框架開發OAuthserver以及client

1. server端開發

記錄一下整個過程的問題,參考鏈接:

  1. https://segmentfault.com/a/1190000015814671
  2. https://blog.csdn.net/a1264718192/article/details/84710183
  3. https://bshaffer.github.io/oauth2-server-php-docs/cookbook/

第三個是我所用的庫的官方文檔。剩下兩個帖子應該也都是參考那個來的。

  1. 數據庫名我用了前綴,所以按照鏈接1中的方法修改了pdo.php中的相應代碼。

  2. server端的代碼按照鏈接2中的寫法,和官方文檔中也是對應的,只是放到同一個控制器的不同方法而已。

  3. 示例代碼中,只讓用戶選擇是否授權,沒有校驗用戶身份。我們一般見到的是要讓用戶輸入用戶名/密碼來同意授權,所以要增加校驗用戶名/密碼的部分。
    Pdo.php中有checkUserCredentials函數,這個函數可以用來校驗用戶身份,繼續跟進這個函數,可以修改你所用的密碼加密方式。Pdo.php的註釋中也強調了不要使用plain text

  4. 另外,我創建的數據庫表和鏈接1中一樣,只創建了5個。checkUserCredentials這個函數要用到user_table。我之前開發的部分已經有了一個存儲用戶名、密碼的表了,所以我只需要將相應表名賦值給user_table就可以了。
    在這裏插入圖片描述

  5. 驗證了用戶身份,並且用戶同意授權,按照OAuth的流程,就可以重定向到redirect_uri指定的鏈接,帶上code參數。重定向鏈接是$response->getHttpHeader('Location')。直接return redirect($response->getHttpHeader('Location'))即可。

(目前server端就做了這些事情。)

2. client端開發

server端一樣,首先找一個庫。我用的是https://github.com/thephpleague/oauth2-client,正好這個庫給例子時用的server端是用bshaffer那個開發的。

還是一樣,現在項目中下載好這個庫。弄server端的時候沒搞清楚執行composer require時候要在哪個目錄下…因爲我對composer不是很熟悉。這次弄清楚了。在thinkphp根目錄下有一個composer.json文件,在thinkphp跟目錄下執行composer require league/oauth2-client,會把文件安裝到vendor/目錄下,並且修改指令當前目錄下的composer.json文件。vendor/目錄下原本就包含composer/目錄,是composer必有的。再詳細和composer相關的我沒看,大概知道這麼點。

在這裏插入圖片描述

開發業務的時候只需要將repo裏給的實例代碼放到你的控制器裏就可以了。和server端的開發差不多。理解一下那個代碼的功能,知道每條語句是個什麼作用,然後就基本可以寫自己的業務了。

我要做的只是在通過OAuth第三方登錄後,拿到Server端傳給我的user_id,然後到數據庫裏去查有沒有和這個user_id綁定的賬號,有,就認爲是對應賬號登錄。

發佈了36 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章