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大小寫
標簽語法轉換
控制器和模型類后綴
請求對象和響應對象和常量去除