最近自學了ThinkPHP,這裏做一個學習過程記錄,希望以後記憶模糊的時候可以翻看。
一)ThinkPHP安裝
1)官網已經不再提供軟件包下載,採用composer和git的方式下載和更新;
2)Windows安裝方式
下載安裝composer之後,先通過命令行配置composer:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
如果下載緩慢或上述地址產生障礙,可以使用國內阿里雲鏡像地址:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
3)開啓服務器環境
wamp或者PHPstudy,瀏覽器地址欄輸入loacalhost進行測試,看是否可以登錄本地服務器。
4)進到wamp或者PHPstudy的www目錄下,安裝ThinkPHP對應版本:
composer create-project topthink/think=5.1.* tp5.1test
說明:後綴tp5.1test指的是目錄名。
5)安裝完think框架之後,進行打開測試,瀏覽器地址欄輸入:
http://localhost/tp5.1test/public/
如果安裝成功,則可以成功打開“ThinkPHP V5.1歡迎頁面”。
6)如需更新項目版本,則可以進入項目根目錄,然後通過以下命令進行更新:
composer update topthink/framework
二)URL解析
ThinkPHP的URL訪問規則如下:
http://serverName/index.php/模塊名/控制器名(類名)/操作名/參數/值...
說明:serverName指的是“localhost/tp5.1test/public”,這一整段都是serverName,後續部署網站時就對應雲服務器或服務器的IP。
截圖如下所示:
舉例:
http://localhost/tp5.1test/public/index.php/test/abc/hello/name/jimson
截圖如下:
另外,還有另一種訪問方式:
http://localhost/tp5.1test/public/index.php?s=test/abc/hello/name/jimson
而且,我們可以通過配置Apache的配置文件httpd.conf,將它裏面的mod_rewrite.so這一行前面的#好去掉,然後重啓環境,即可省略一些URL訪問更加簡潔:public/index/abc/hello/name/jimson
三)模塊設計
ThinkPHP框架的默認訪問模塊是index,可以通過config目錄下的app.php進行設置,截圖如下:
如果application目錄下的模塊目錄只有一個(一般指小項目),則可以通過配置app.php的app_multi_molule選項設置成false,截圖如下:
並且可以通過在index.php裏的:
Container::get('app')->bind('test')->run()->send();
這種方式綁定單一的模塊。
而且如果該單一的模塊下只有一個控制器,則可以繼續追加:
Container::get('app')->bind('test/abc')->run()->send();
但是注意,上面這種綁定和追加的方式會使其他模塊無法訪問,只適用於單模塊形式。
空模塊
我們還可以通過配置app.php的其他選項來控制模塊的行爲屬性,比如empty_module可以控制空模塊:
'empty_module' => '404'
一般可以設置一個404的頁面,使空模塊指向它。
但是注意,空模塊生效的前提是多模塊開啓和沒有bind模塊。
另外,如果我只有一個模塊index,則模塊的目錄可以去掉,然後配置app.php的app_multi_molule選項設置成false,只需要controller目錄即可,而命名空間也就去掉了模塊名:
namespace app\controller;
截圖如下:
四)環境變量
ThinkPHP提供了一個類庫Env來獲取環境變量,可以用來獲取當前項目的各種目錄,如應用目錄、框架目錄、路由目錄等等,截圖如下:
獲取方式:
Env::get('app_path');
說明:get是一個類方法(靜態方法)。
五)控制器定義
繼承控制器可以更方便使用功能,但不是必須,繼承的方式是:
use think\Controller;
class Index extends Controller
打開調試模式,截圖如下:
更改根命名空間,需要在項目根目錄下新建.env文件,配置以下鍵值對參數:
app_namespace=application
說明:將項目根命名空間配置爲application。
渲染輸出的三種方式
1)return
直接將結果return回去即可:
return "這是結果";
2)json輸出(比如輸出數組)
舉例如下:
$data = array('a'=>1,'b'=>2,'c'=>3);
return json($data);
3)模板輸出
創建步驟如下兩個截圖:
模板初始化
可以通過重寫Controller類的initialize方法進行模板的初始化:
use think\Controller;
protected function initialize()
{
parent::initialize();
//初始化內容
//......
}
六)控制器操作
1、前置操作
可以更加靈活的初始化,方式是通過定義一個屬性來實現:
protected $beforeActionList = [
'first',
//one方法執行不調用second前置
'second' => ['except' => 'one'],
//third前置只能通過調用one和two方法觸發
'third' => ['only' => 'one,two'],
];
protected function first()
{
echo 'first<br />';
}
protected function second()
{
echo 'second<br />';
}
protected function third()
{
echo 'third<br />';
}
public function one()
{
echo "one";
}
public function two()
{
echo "two";
}
2、重定向
ThinkPHP的Controller類提供了兩個跳轉的方法,success(msg,url)和error(msg),用於實現跳轉重定向:
public function index()
{
if($this->flag)
{
$this->success('成功!','../');
} else {
$this->error('失敗!');
}
}
其實上面跳轉的頁面是:
thinkphp/tpl/dispatch_jump.tpl
成功和失敗都是跳轉上面這個頁面,當然我們也可以進行修改,修改的位置截圖如下:
3、空方法和空控制器
空方法可以通過定義特定的方法進行攔截:
public function _empty($name)
{
return "此方法不存在:".$name;
}
空控制器也可以進行攔截,通過定義Error控制器的形式,截圖如下:
七)數據庫與模型
Navicat給root設置密碼,截圖如下:
新建模型和模型訪問對應數據,步驟截圖如下:
八)查詢數據
查詢的常見方法有下面的這些:
Db::name();
Db::table();
find();
findOrFail();
findOrEmpty();
select();
selectOrFail();
value('username');
getLastSql();
column('username','id'); //查詢指定列數據,按id排序
order('id','desc'); //將結果倒敘排序顯示,一般接於where語句之後
注意:除了find和select方法是結果查詢之外,其餘方法查詢結果均爲數據庫對象,它們可以一直使用鏈式查詢操作,直到遇到find和select方法爲止。
多次新建查詢對象會對資源造成浪費,所以一般進行這更加安全的操作,截圖如下:
九)數據庫增刪改操作
常見方法如下:
insert();
delete();
update();
十)查詢表達式
十一)模型定義
模型定義名稱必須和數據庫的數據表命名對應,比如你的數據表是tp_user,則符合規範的模型定義名稱是User。
1)手動修改主鍵
之後刪除數據時則需要指定修改的主鍵才能刪除,而不是創建時的主鍵,截圖如下:
說明:指定主鍵之後,上面destroy只能根據指定的主鍵進行刪除。
2)指定數據表
因爲定義模型時數據表名稱(比如tp_user)和模型名稱(比如User)是對應關係,但是我們可以手動指定數據表,截圖如下:
3)模型初始化
截圖如下:
另外注意,模型操作和數據庫操作有區別:
數據庫操作需要指定表,而模型操作不需要;
數據庫操作返回的列表是一個二維數組,而模型操作返回的是一個對象數組。
截圖如下:
十二)模型添加和刪除
模型往數據庫添加數據和刪除數據舉例如下。
添加方式的截圖:
刪除方式的截圖:
十三)模型修改和查詢
1、更新(修改)
1)通過定義update,然後通過get方法獲取主鍵的方式進行更新,截圖如下:
注意:如果是通過save方法進行更新,數據本身沒有變化,則不更新,如果想強制更新,則可以使用force方法:
$user->force()->save();
2)通過where和find方法進行更新,截圖如下:
3)通過raw方法進行更新,截圖如下:
注意:inc指price升序。
4)通過save([],[])兩個數組參數的形式進行更新,第一個參數指需要更新的數據,第二個參數指查詢條件,截圖如下:
5)使用savaAll方法進行批量修改,發方法返回被修改的數據集合,截圖如下:
注意:該方法第一個參數是固定的,爲id,只能通過主鍵id進行批量修改。
6)最後一種方式是通過靜態方法where結合update方法,或者直接通過靜態方法update進行更新,截圖如下:
這裏發現,模型的新增和修改都是通過save方法進行,所以操作過多容易造成混亂,可以通過isUpdate方法進行標識,false則爲新增,true則爲更新,截圖如下:
2、查詢
1)get方法,截圖如下:
2)where和find方法,截圖如下:
注意:get和find方法查詢數據,如果不存在則返回null。
3)通過getOrFail和findOrEmpty方法查詢。
注意:第一個方法獲取數據不存在時拋出異常,第二個則返回空模型。
4)獲取單獨的字段,可以通過使用“->”符號進行獲取,但是模型內部不推薦使用$this->username這種方式,而是通過getAttr方法的方式,如下兩個截圖:
5)其他的查詢方式,截圖如下:
十四)模型獲取器和修改器
獲取器:獲取到進行過濾操作(比如輸出對應中文,變成大寫等等)。
1、獲取器
1)方式一
我們可以通過定義getFieldAttr()方法的方式(Field指數據庫數據表中對應字段的名字),獲取到數據庫數據表中某個字段所有的值(也就是定義數據表時的某個Field,比如status),但是字段本身的類型可能有很多類型,比如是數值或字符串等等,我們這時就會有其他的需求,比如根據不同數值輸出對應的中文,那這個功能就叫做獲取器。
截圖如下兩個:
注意:這個Status就是指Field了。
另外可以定義虛擬字段對所有字段任意進行過濾,截圖如下:
被過濾的字段我們也可以通過特定的方法輸出其原始值,截圖如下:
2)方式二
我們還可以通過WithAttr方法在控制器中直接實現動態獲取器,截圖如下:
注意:模型獲取器(也就是第一種方式)優先級高於動態獲取器。
2、修改器
我們可以通過定義setFieldAttr()方法的方式定義修改器,截圖如下:
注意:新增和修改都會調用觸發修改器,但是注意,修改器只對模型方法有效,數據庫操作方法無效,不觸發,比如insert這些方法。
十五)模型搜索器和數據集
1、搜索器
搜索器與獲取器這些類似,是對查詢表達式的封裝,截圖如下:
2、數據集
數據集指的是通過all和select方法查詢返回的數據集對象,和數組操作方法一樣,循環遍歷、刪除元素等等。
截圖如下:
最近新開了一個微信訂閱號“飛策科技”,歡迎大家的關注,關注之後閱讀更加方便。
當然,以後博客和訂閱號兩邊都會更新。