前言
最近想用ThinkPHP
開發一些東西。以前沒有使用框架開發過,從來都是一個文件一個文件地寫…emm…簡單記錄一下這中間我遇到的問題,不會詳細寫使用過程。
問題記錄
學習過程中最好還是參考官方的開發文檔。
理解各個文件目錄、各個文件大概是什麼結構、什麼作用。
-
Application
和module
。這兩個在開發文檔的 架構總覽 章節寫的很清楚了。我現在理解的情況是,應用可以包含多個模塊,而多個模塊最常見的形式是:管理員後臺和用戶界面。我目前要開發的網站不需要管理員後臺,所以其實是使用了單模塊,但是不知道之後會是什麼情況,所以仍然是使用多模塊配置。
模塊裏面可以包含多個控制器,應該是實現不同類別的響應。每一種控制器中又可以包含多個方法。
說這個,是因爲我剛開始寫的時候目錄搞錯了,我把所有的文件都當做是新的模塊來創建。正確的做法應該是把文件當做是新的控制器來創建。
如果理解有錯的話,之後再來改。 -
我下載的是v5.1,默認開啓了路由,比如要訪問
Index
控制器中的index
方法,則url
爲http://xx.xx.xx.xx/public/index/Index/index
。第一個index
是模塊名,第二個index
是控制器名,第三個index
是方法名。 -
要在
thinkphp
中引入html
模版…剛開始我還以爲要在Login.php
裏面添加相應的html
代碼…
參考https://blog.csdn.net/qq_36370731/article/details/78053248
。在模塊目錄下創建view
子目錄,在控制器文件中使用$this->fetch(模版名)
,thinkphp
會自動爲你加載模版的。目前還沒有出現需要在模版中配置參數啥的…這些開發文檔都有介紹,用到的話直接去找就ok。 -
如果配置了
tpl_replace_string
,發現不起作用,那可以去找thinkphp/library/think/view/driver/think.php
中的tpl_cache
,默認值爲true
,改爲false
。 -
後面版本的
thinkphp
把session
類放到了facade\session
裏,所以如果直接使用Session::get()
等函數的時候會提示 靜態方法不能這樣調用 這樣的錯誤。所以要在開頭引用use think\facade\Session
就ok了。本來最開始的時候都是用的原生的
php
中的session
,自己每次寫的。後來因爲要配置一下session
文件的存儲路徑(我要在同一個服務器上搭兩個服務器,所以希望session
文件存放位置分開),在config
目錄下的session.php
文件配置path
參數之後發現不起作用…然後看到官方文檔裏的下圖內容,就決定還是換成用人家弄好的類好了,配置不起作用的問題也解決了。
-
用了
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
框架開發OAuth
的server
以及client
。
1. server端開發
記錄一下整個過程的問題,參考鏈接:
- https://segmentfault.com/a/1190000015814671
- https://blog.csdn.net/a1264718192/article/details/84710183
- https://bshaffer.github.io/oauth2-server-php-docs/cookbook/
第三個是我所用的庫的官方文檔。剩下兩個帖子應該也都是參考那個來的。
-
數據庫名我用了前綴,所以按照鏈接1中的方法修改了
pdo.php
中的相應代碼。 -
server
端的代碼按照鏈接2中的寫法,和官方文檔中也是對應的,只是放到同一個控制器的不同方法而已。 -
示例代碼中,只讓用戶選擇是否授權,沒有校驗用戶身份。我們一般見到的是要讓用戶輸入用戶名/密碼來同意授權,所以要增加校驗用戶名/密碼的部分。
Pdo.php
中有checkUserCredentials
函數,這個函數可以用來校驗用戶身份,繼續跟進這個函數,可以修改你所用的密碼加密方式。Pdo.php
的註釋中也強調了不要使用plain text
。 -
另外,我創建的數據庫表和鏈接1中一樣,只創建了5個。
checkUserCredentials
這個函數要用到user_table
。我之前開發的部分已經有了一個存儲用戶名、密碼的表了,所以我只需要將相應表名賦值給user_table
就可以了。
-
驗證了用戶身份,並且用戶同意授權,按照
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
綁定的賬號,有,就認爲是對應賬號登錄。