ThinkPHP-5教程
簡介

相關鏈接:
https://www.kancloud.cn/manual/thinkphp5/118003
環境准備
必備環境

- 上面的環境擴展信息必須在php.ini進行開啟,同時還需要將php.exe加入到環境變量中(TP5里面也提供了類似laravel里面的artisan命令行功能,所以也要把php.exe加入到環境變量)

- 建議使用PHPstudy集成開發環境

- 常見php.ini的擴展的開啟同時還要開啟Apache里面的某些擴展

- Apache的rewrite模塊的開啟(到時候TP里面要做為入庫文件的隱藏)

composer安裝
官網:http://www.phpcomposer.com/
相關文檔:https://www.kancloud.cn/thinkphp/composer/35668
無網安裝composer軟件

由於上面的exe安裝過程中需要聯網進行操作,並且服務器在國外,一般安裝不成功,上面的方式不可取。換為下面的方式進行操作。
- 下載對應的composer.phar文件
下載地址:https://getcomposer.org/download/

- 下載一個window的命令行加強工具(cmder),該工具比本身的DOS要強很多倍,並且可以自己配置window的下命令。
網站:http://www.cnblogs.com/jadeboy/p/5132423.html

- 將cmder.zip加壓到一個非中文非空格的目錄

- 查找php.exe的絕對路徑

路徑:C:\phpStudy\php\php-7.0.12-nts\php.exe
- 設置alias別名,可以使用composer命令

設置如下內容
alias composer=C:\phpStudy\php\php-7.0.12-nts\php.exe C:\dev\cmder\composer.phar $*

- 重新打開一個cmder的命令行輸入 composer -v

安裝
composer安裝TP5
TP5手冊:https://www.kancloud.cn/manual/thinkphp5
本地服務器啟動方式:php -S localhost:8000 -t
- 使用composer安裝

> composer create-project topthink/think local.tp5.com --prefer-dist
安裝PHPstudy的www目錄下

安裝后

- 使用composer安裝后,我們可以使用PHP內置的web服務器來啟動項目
> php -S localhost:8000 -t public

訪問:

注意: PHP內置的web服務器一般也就測試使用,上線肯定不用。
-S 代表是監聽的IP的地址和端口
-t 代表是網站的根目錄
源碼包安裝TP5
- 加壓tp5的源碼包到虛擬主機目錄

2. 配置虛擬主機


- 修改hosts文件

- 修改vhost文件,同時修改AllowOverride All配置,稍后偽靜態隱藏入口文件需要開啟該配置項

5. 域名訪問效果

基礎
需要注意: 在新版的TP5里面的,目錄的規划和文件的命名有很大的差別(和之前相比)
開發規范

主要的變化如下:
- 除了類文件的名稱需要大寫之外,其他的所有的文件和文件夾都使用小寫命名。

還要類文件,也不需要在使用類后綴(以前寫一個控制器 UserController.class.php 現在直接這樣寫User.php即可)
- 函數都建議使用下划線的命名方式(get_user_info_by_id)類都是大駝峰的方式,類里面的方法都使用小駝峰
- 還有配置項都是用小寫(以前使用的是大寫)
目錄規范
在新版的TP5里面的目錄變化也是很大的,需要注意。
相關文檔:https://www.kancloud.cn/manual/thinkphp5/118008
整體分析

application目錄分析

index模塊

public目錄

Tp官方的源碼目錄


Vendor目錄

入口文件
注意:在Tp5里面的入庫文件和Tp3.2是不一樣的,需要注意,是在public目錄下。

控制器
系統默認控制器
1. tp默認控制器文件位置

注意:上面是TP默認的控制器的文件的目錄,並該控制器文件首字母大寫,同時沒有類后綴。(以前:UserController.class.php)
2. 如何在瀏覽器訪問該控制器下的方法?
答:域名/index.php/index模塊/index控制器/lst方法,這里TP5使用的phpinfo的模式進行URL的調度。

3. 效果

自定義控制器編寫
1. 在index模塊的controller控制器文件夾下編寫一個自己的Goods.php控制器文件

2. URL訪問

注意:如果我們的控制器文件使用的大駝峰方式命名,需要使用下划線方式訪問
1. 定義一個以大駝峰方式命名的類文件

2. URL訪問的時候,直接輸入大駝峰方式訪問,則報錯

3. 解決:使用下划線方式訪問

調試模式開啟
1. 修改application/config.php配置文件,將如下的信息更改為true

- 開啟調試模式后,報錯更友好

視圖
注意:在Tp5里面可以使用兩種方式來載入視圖:
方式一:
語法:return view('視圖名稱', '關聯數組,傳遞給視圖的數據')
控制器代碼:

視圖代碼:

方式二:
語法:return $this->fetch('視圖名稱', [關聯數組,傳遞給視圖數據]),但需要繼承 \think\Controller控制器
控制器代碼:

視圖代碼:

URL和路由
URL訪問

注意1:在TP5里面,當使用URL進行訪問的時候,地址欄目的控制器的名稱無論是大小還是小寫,都會被統一的轉換為小寫。
注意2:如果控制器文件的使用UserInfo形如這樣的命名,需要使用下划線訪問。如果不希望轉換,同時,我們自己寫的控制器的訪問也不希望轉換為小寫,可以配置 url_convert = false 即可。

以后訪問大駝峰的方式,則不會報錯。

GET參數處理
URL訪問

代碼

隱藏入口文件

- 需要開啟Apache的Rewrite模塊

- 開啟虛擬主機的AllowOverride All

- 在網站根目錄添加.htaccess文件

內容參考:

訪問效果:

注意:通過上面的操作,我們可以非常方便的隱藏入口文件,但是URL地址還是很長,是否可以進一步的優化,便於SEO。可以使用TP5里面的路由進行完成。
路由定義
注意1: 在Tp5里面,路由並不是必須的,不使用路由的情況下,照樣可以使用pathinfo的方式進行訪問。
例如:域名/[index.php入口文件]/index模塊名稱/index控制器名稱/lst方法名稱/get參數
注意2:也可以開始Tp5的路由和pathinfo同時一起使用。修改配置文件進行開啟

注意3:路由文件位置:application/route.php文件
案例一最簡單的路由
- 在application/route.php文件定義規則

- 定義處理路由請求的控制器和方法

3. 效果

對於上面的操作,我們發現goods后面的數字一般代表是某件商品的主鍵ID,一般這個不是寫死。如果寫死了,訪問其他的商品信息,則立馬報錯(例如范圍的是15)

案例二-路由參數
1. 定義路由參數是可以變的

- 在控制器的方法里面獲取參數

案例三-路由類
除了上面的方式可以定義路由外,還有其他的方式定義路由,使用系統自帶的Route路由類
1. 路由定義

- 控制器方法定義

效果

案例四-閉包處理
對於上面的這種路由類的定義,我們還可以使用閉包函數進行響應。
1. 定義路由規則

- 創建視圖文件(public/view下)

效果

URL分隔符
在TP5里面的URL的分隔符默認使用的/ ,可以通過配置 pathinfo_depr 參數改變。

- 修改配置文件的 pathinfo_depr

訪問

路由參數
單獨在建立一個Blog的控制器文件,然后處理某年某月的日志博客,可以使用TP里面自帶的命令行工具建立控制器。
url: http://local.tp.com/blog-2015-12 ===> 某個控制器下的方法

月份正則:http://blog.csdn.net/ljsososo/article/details/16898541
路由分組
方式一:

方式二:

其他的路由
resource資源路由:其他的如get或者是post

手冊提供

請求和響應
請求
在TP5里面接收用戶的請求數據可以使用如下的方式進行處理:
- Request的實例
a) $request = Request::instance()
- 在控制器里面繼承基類控制器
a) $this->request()->param('參數')
- 使用 input() 函數(注意: 在TP5里面已經不能在使用Tp3.2里面的I函數)
- 參數的依賴注入

注意:在TP5里面IS_GET、IS_POST等常量已經不存在
如果要獲取,則需要使用Request實例進行方法獲取

響應
視圖載入

提示信息-成功和錯誤
- 定義路由

- 展示添加表單

3. 在User控制器的add方法里面完成處理

注意:TP5里面已經不再使用U函數了。
url函數
在TP5里面url地址的生成需要使用url函數,在Tp3.2里面的U函數已經不能在Tp5里面進行使用了。
方式一:

效果:

方式二:

效果:

方式三:參數的另外一種方式

效果:

方式四:使用系統內部的Url類進行生產URL地址

效果:

重定向

直接跳轉,不給提示信息
返回數據類型
注意:默認情況下,TP5里面返回的是html文本信息,如果我們期望返回的是json格式的數據,則需要修改配置文件

控制器下的方法:

瀏覽器效果

json中文轉義

效果

文檔:http://blog.csdn.net/default7/article/details/38123201
TP5自帶json函數

效果:

json函數源碼

數據庫操作-DB類
學習手冊

數據庫配置

注意1:在TP里面,可以在模塊下面單獨的建立一個database.php配置文件,代表這個模塊就使用配置的這個數據庫

注意2:我們可以在config.php里面配置多個數據信息也是可以的

數據庫操作-查詢
先在控制器引入Db類

使用Db類的query方法即可

查詢也可以使用占位符

數據庫操作-增刪改
使用Db類的execute方法

數據庫切換
- 在application/config.php里面配置一個db1的數據庫信息

- 使用Db::connect('db1') 獲取 dedecms數據庫里面的數據


手冊:

構造器-查詢
方式一:獲取所有的數據

效果

方式二:獲取單條數據(a. 根據主鍵 b.查詢條件)

效果

例如:查詢用戶名為caoyang的記錄

構造器-添加

構造器-更新

構造器-刪除

別名處理
對於上面的查詢構造器,使用的是Db::table(表前綴的表名),可以換一種方式來不寫表前綴
Db::name('不要表前綴的表名')

建議使用Db::name()方法調用
助手函數
在新版TP5里面已經不存在M()函數(tp3.2的時候可以幫我們實例化系統的模型)使用的是db()幫助函數進行替換
db('不要前綴的表名')->select();

閉包查詢
db('admin')->select(function($query){
// $query里面可以設置查詢的條件
});

使用Query對象查詢
有點類似laravel里面的查詢構造器


模型學習
在MVC里面,M是負責對數據的處理,其實在TP5里面模型封裝的已經很好了,基本上我們不用做過多的操作,使用系統自帶的基類即可完成大部分的curd操作。
模型定義
需要寫在模塊的model目錄下,我們可以使用TP5自帶的命令行工具進行生成。
注意1:在TP5里面模型也不在使用類后綴,直接就是使用去除表前綴后的名稱作為模型的名稱。(模型名稱使用大駝峰的方式)
例如:表的名稱為 sh_admin 對應的模型文件名稱 Admin.php
例如:表的名稱為 sh_goods_attribute 對應的模型文件名稱 GoodsAttribute.php
>php think make:model app\index\model\User

創建后

定義sh_user表
上面的模型和下面的sh_user是對應的

基本操作-增加
完成數據的增加主要有如下幾種方法
- 模型對象的save方法(先為對象設置屬性)
- 模型類的create靜態方法
- 模型對象的saveAll批量添加方法
實操:
1.模型對象的save方法(先為對象設置屬性)

2.模型類的create靜態方法【簡化操作】

3.模型對象的saveAll批量添加方法【上面的兩種操作,都只能完成單條數據的插入,如果批量插入數據,需要使用模型對象的saveAll方法】

基本操作-查看
查詢數據主要有如下幾種方法
- 模型類的get靜態方法【存在返回值為對象,否則為null】
- 通過字段查詢getByFieldname()方法
- 根據條件查詢get(['username' => 'root'])
- where方法查詢->find()
- where方法查詢->select()
- 模型類的all靜態方法和select靜態方法
實操:
1.模型類的get靜態方法【存在返回值為對象,否則為null】,通過傳遞主鍵獲取數據

效果

2.根據條件查詢get(['username' => 'root'])
方式一:

方式二:使用where方法傳遞(需要注意后面要通過find()方法調用一下)

3.通過模型對象的字段查詢getByFieldname('查詢條件')方法

- 模型類的where方法查詢,然后調用find()方法

5.where方法查詢->select()
方式一:

方式二:

6.模型類的all靜態方法和select靜態方法

注意:對應all和select方法返回的數據,是一個數組,數組中的每個元素是一個模型對象,如果我們需要把他們轉換為普通的二維數組(數組中的元素也是數組)

效果:

便捷方式獲取模型實例
在新版的Tp5里面可以有如下兩種便捷方式獲取模型實例:
方式一:使用model助手函數

方式二:使用TP5自帶的Loader類的model靜態方法

總結:在新版的TP5里面,在原先TP3.2里面的單字母函數D已經不存在,取而代之的是model函數。
基本操作-更新
更新數據主要有如下幾種方法
1.先 get(),后save()
2.模型類update靜態方法
實操:
1.先調用模型類的get()靜態方法,然后在調用模型對象的save()方法

2.模型類update靜態方法
方式一:

方式二:

基本操作-刪除
刪除數據主要有如下幾種方法
1.先使用模型類的get()靜態方法,然后在使用模型對象的delete()方法
2.模型類destroy靜態方法
實操:
1. 先使用模型類的get()靜態方法,然后在使用模型對象的delete()方法

2.模型類destroy靜態方法

3.使用destroy同時刪除多條數據

4.模型對象的delete方法進行刪除(需要傳遞刪除條件)

相關文檔
網站:https://www.kancloud.cn/manual/thinkphp5/135186
模型關聯
注意:在TP里面的模型關聯沒有laravel里面那么好用,簡單的了解即可,一般來說,還是建議自己在代碼里面完成模型間的關系處理。不要過來的依賴模型關聯。
在TP里面主要是定義三種模型關聯類型:
一對一
簡介
注意:一對一的關系是可以在一張表里面完成的,但是一般來說,數據有冷熱之分,熱數據(查詢頻繁的數據,應該單獨的抽取稱為一張表,水平方向字段數應該盡可能的少)冷數據(查詢較少的數據,單獨的放在另外的一張表里面進行操作,通過一個外鍵和熱數據表進行關聯。例如下面的表里面的是通過sh_profile表里面的user_id產生的關聯。)
場景:例如一個用戶存在一個具體的用戶履歷信息
sh_user 用戶表
| id |
username |
passsword |
|
| 1 |
caoyang |
admin88 |
gogery@163.com |
| 3 |
andy |
admin88 |
andy@sina.com |
sh_profile 履歷表
| id |
user_id |
address |
card_id |
education |
...... |
| 23 |
1 |
深圳市 |
421023112 |
本科 |
........ |
| 34 |
3 |
廣州市 |
7754123123 |
碩士 |
|
自己手工的連表查詢:
> select a.*, b.address from sh_user a left join sh_profile b on a.id = b.user_id where a.id = 3;
關聯查詢
- 建立用戶表和履歷表

- 創建User.php和Profile.php模型文件,並在User.php模型文件里面定義模型關聯信息

履歷表模型

- 查詢關聯信息

效果:

對於上面的操作,完全可以自己寫sql完成

百度:鏈式操作
http://www.thinkphp.cn/topic/43233.html

關聯添加
1. 完全可以自己去在代碼里面完成,沒必要依賴TP的關聯模型。

- 使用Tp的關聯模型進行數據的添加

一對多
簡介
一對多的模型還是很常見的,一般解決方法就是增加一張附加表,然后在附加表里面增加一個關聯字段。
常見:一個用戶可以存在多本書籍。
sh_user表:
| id |
username |
passsword |
|
| 1 |
caoyang |
admin88 |
gogery@163.com |
| 3 |
andy |
admin88 |
andy@sina.com |
sh_book表
| id |
user_id |
img |
author |
title |
.... |
| 1 |
3 |
1.jpg |
莫言 |
分錄肥臀 |
|
| 3 |
3 |
3.jpg |
西紅柿 |
斗戰 |
|
關聯查詢
- 創建book模型,並且在user模型里面定義關聯關系

定義關系

- 構造測試數據

- 查詢數據

關聯添加
1. 不依賴TP的關聯模型,自己手工的解決

- 使用Tp的關聯模型完成

多對多
文檔:https://www.kancloud.cn/manual/thinkphp5/142359
自動驗證
相關文檔:https://www.kancloud.cn/manual/thinkphp5/129319
場景:用戶的添加的時候完成自動驗證,在TP5里面可以使用多種方式完成驗證操作。
驗證類文件-方式一
- 在模塊下建立一個validate目錄,編寫對應的驗證類(類文件的名稱和模型名稱一致)

- 在控制器中使用模型對象的validate方法調用

效果

驗證類文件-方式二

控制器驗證-方式一
- 調用控制器的$this->validate(驗證數據,驗證類名稱)方法

控制器驗證-方式二
1.調用控制器的$this->validate(驗證數據,驗證的規則)方法

注意:驗證通過返回true,否則返回錯誤的提示信息
注意:如果用戶想自定義驗證提示信息,則可以傳遞第三個參數

系統驗證類的使用
在有的時候我們不希望自己定義驗證類來處理,可以使用系統自帶的Validate類進行驗證

驗證類的靜態方法

演示

驗證場景
TP里面使用了一種叫做驗證場景的概念,針對不同的場合使用不同的驗證,例如:在添加的時候有添加的驗證規則;在更新的時候有更新的規則

表單驗證
主要是為了防止外站提交(csrf攻擊)
解決:
1. 在服務器返回表單信息的之前,生成一個唯一的密鑰,然后在表單里面的隱藏域里面存放一下,同時還要把數據存到session里面一下。
2. 用戶填完信息后,點擊提交后,檢測用戶表單隱藏域里面的密鑰和session里面的時候一樣,一樣則沒有偽造提交(外站提交)
實現:
1. 在提交表單里面使用token()函數生成一個隱藏域

- 在自動驗證里面進行驗證

坑-dateFormat驗證規則
在TP5如果需要驗證某個時間數據,可以指定驗證個還是,我們可以使用dateFormat規則,同時為其傳遞一個驗證的規則字符串。

查看Validate底層的dateFormat方法

相關文檔:
http://code.ziqiangxuetang.com/php/func-date-parse-from-format.html
SQL調試
本地調試模式開啟

修改config.php配置文件即可

打印最后執行的sql

雜項-驗證碼
在完成驗證之前,先做一個簡答的后台的登錄頁面 主要是學習驗證碼和自動生成
驗證碼
- 使用composer下載TP官方提供的驗證的類庫
composer require topthink/think-captcha

下載后位置

- 開啟路由規則(因為官方提供的驗證類庫里面需要使用到路由)

- 在控制器里面進行驗證處理(提供兩種方式)

驗證碼配置
- 在模塊的extra目錄下增加一個captcha.php配置文件

- 書寫配置項

具體的配置項目

源碼分析
1. 驗證碼源碼的目錄

- 查看一下幫助函數


- 驗證路由和規則擴展

- 驗證碼生成

雜項-上傳
在TP5里面實現文件上傳是很簡單的
- 定義一個表單

- 在控制器的方法里面完成上傳的處理

驗證

直接調用file對象validate方法即可

上傳文件的命名
默認的文件的目錄命名是的當前的日期,文件的名稱是的md5

- 修改默認的命名方式位sha1

效果

- 修改默認的命名方式位uniqid函數

效果

命令行工具
控制器生成
語法一:
> php think make:controller app/index/controller/Blog

可以在application的index模塊下建立一個Blog控制器

語法二:
> php think make:controller app/index/controller/Blog --plain

生成的控制器代碼里面沒有任何的方法

模型生成
語法一:

模塊生成
定義build_admin.php文件,規定生成內容

語法:
> php think build --config build_admin.php

查看內容

Session機制

Session初始化

一般來說我們不需要手工的進行設置,TP5會在第一次調用Session類的時候進行初始化操作。
讀取Session數據

通過Request類型的實例的session可以進行session的操作

操作session
系統提供的Session類主要有如下幾個方法來操作session
- set方法:設置
- get方法:獲取
- has方法:判斷是否存在某個key
- delete方法:刪除某個key
- clear方法:清空
- flash方法:設置一次性session
- flush方法:清空
助手函數

模板輸出

session驅動

Cookie機制
cookie初始化

cookie操作


助手函數

模板輸出

注意:3.2和5.0的區別
tp3和tp5之間還是有些區別的,需要注意的是,從開發者的角度來說,tp底層是改了很多東西。對於使用者來說,更多的是寫法上的一些變化。
相關文檔:http://www.cnblogs.com/wupeiky/p/5850108.html
控制器調用載入視圖

單字母函數去除

常見助手函數

獲取某個字段的值

控制器不區分URL大小寫

標簽語法轉換

控制器和模型類后綴

請求對象和響應對象和常量去除

