ThinkPHP學習過程記錄

最近自學了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方法查詢返回的數據集對象,和數組操作方法一樣,循環遍歷、刪除元素等等。

截圖如下:

 

最近新開了一個微信訂閱號“飛策科技”,歡迎大家的關注,關注之後閱讀更加方便。

當然,以後博客和訂閱號兩邊都會更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章