1. 程式人生 > >《TP5.0學習筆記---請求和響應篇》

《TP5.0學習筆記---請求和響應篇》

請求物件Request

我們知道Thinkphp是一個單入口的框架,所有的請求都進入index.php,我們通過index.php來接收所有的http請求,那麼請求中所有的引數,我們都可以同過Request這個物件來接收和處理。

在thinkphp中我們又三種方法可以讓我們獲得Request物件

第一種方式:是框架提供的一個助手函式request()

第二種方式:是通過think下的Request類來獲取它的例項

第三種方式:直接注入Request物件(看截圖)

我們知道Thinkphp是一個單入口的框架,所有的請求都進入index.php,我們通過index.php來接收所有的http請求。那麼我們現在開啟這個index.php

在前邊的學習我們知道,index.php只要定義一些常量以及引入框架的引導檔案就可以了,這裡引入了thinkphp/start.php,現在我們開啟start.php

這裡直接執行了App下的run()方法,它返回的是Response物件,它會執行Response下的send()方法,來返回給我們當前的http請求,在這裡,它先引入了一個base.php,之前我們瞭解到base.php是定義的一些常量以及一些初始化。我們看見它把當前的檔案命名為think(也就是當前的名稱空間為think,也就是這裡的namespace think),所以我們的App也是在think這個名稱空間下。這個think指的是thinkphp/library/think

我們會看見有一個App.php,我們知道類名要和檔名相同

這個檔案的名稱空間也是think。

這個run()方法預設傳遞的就是一個request物件,預設值為null

看一下第一行,如果request為空,它就會執行Request類下的instance()方法來例項化一個request物件。Request是一個單例模式的類,也就是我們在整個應用中,只能例項化一次,在我們的App下的run()中就進行了例項化,那麼我們在以後所有的方法中都可以使用。

從這整個過程我們知道,最先執行的就是App下的run()方法,我們的request物件在我們的run()方法中就已經例項化好了,我們可以在後面進行使用。

能在我們的request物件獲取什麼呢?

1,  獲取瀏覽器輸入框的值

比如說我們現在要獲取我們的域名

如何獲取後邊的控制器名及方法名呢?

那就是pathinfo()方法

2,  通過request物件獲取請求型別

快速判斷是那種請求的函式,如:

$request->isGet();

$request->isPost();

$request->isAjax();

3,  如何獲取請求引數

在thinkphp5.0開始,他所有的get不包含pathinfo中的傳值

要想獲取,可以使用$request->param()

獲取post值就是$request->post()

獲取session中的值$request->session()

我的瀏覽器中還沒存過session值,這裡我想設定一個

注意:我們如果想啟用session,需要修改session的配置,在convention.php中找到,然後複製到應用配置檔案config.php中

之後我再回到瀏覽器重新整理,我設定的session就會出來,看圖

還可以獲取cookie,$request->cookie();

因為我們啟用了session,它預設會有一個cookie

我們也可以自己新增cookie

這些我們獲取的都是陣列,如果我們想獲取到陣列下的某一個值,該如何獲取呢?

比如這樣

別的獲取陣列中的某一個也是這樣,比如cookie  $request->cookie(‘email’);

4,獲取模組  控制器   操作

在我們編寫一些許可權控制的時候,經常會用到許可權控制器和操作,通過第三個選項共同來驗證當前模組是否有許可權,所以在我們的應用中,或者在我們的控制器中,我們也經常使用這些方式來進行獲取

(1)      獲取當前模組

$request->module();

(2)      獲取當前控制器

$request->controller();

(3)      獲取當前操作名

$request->action();

如果我們還想看request物件還為我們提供了哪些方法,我們可以開啟thinkphp/library/think/Request.php

比如說我們看見裡邊還有url()方法,我們就可以試一下

助手函式input

在我們的程式開發過程中獲取引數是十分重要的,所以thinkphp為我們提供了一個助手函式,叫input

我們可以通過input來獲取我們傳遞的各種引數。我們知道thinkphp5.0框架的助手函式都在thinkphp/helper.php檔案中,我們可以找到input函式

我們會看到它首先有一個判斷,判斷當前系統是否存在input 函式,如果存在,它就會跳過該部分,不再定義input函式。我們知道在php中,如果我們將一個函式重新定義,那麼程式是會報錯的,所以我們使用input函式是有一定風險的。我們在執行框架之前,也就是說我們在入口檔案的地方,如果我們引入其他的檔案,我們在其他檔案中定義了input這個函式,那麼系統將無法使用input這個函式來獲取我們的各種引數,它還是使用我們自定義的那個input值。當然,在我們使用框架的時候,我們規範中是不允許重新定義的,或者說,我們團隊中應該有這樣的規範,不能定義和我們系統助手函式相同的函式名,如果定義的話,如果在之前引入,那系統中的函式將不能使用,如果在之後使用,那麼程式會報錯。

下面我們來看一下input函式的具體實現

Input函式有三個引數,第一個是$key,是我們要獲取的變數名,第二個值為$default,如果我們要獲取某一個變數,但是這個變數在系統中並不存在,它將直接返回我們的$default值。第三個引數為$filter,我們獲取我們的變數值,那麼我們是需要進行過濾的。如果你需要對變數的值進行過濾,那麼你可以傳遞第三個引數來進行過濾,它接收的是一個函式名。然後接著看下邊的程式碼

如果我們的$key值第一位是‘?’,也就是說,我們傳入進來的$key值以“?”開頭,那麼他將直接把“?”去掉,並將$has值設定為true.(這裡的strpos()函式作用是找到某個字元或字串,第一次出現的位置)

接下來的那個if判斷,如果$key值存在‘.’這個符號,那麼它直接將用‘.’進行分割,將我們的$key分割成兩個變數。後邊的程式碼很好理解,自己看一下

我們在index/Index/index下列印一下$request->param()

會看見typy和id,type是通過pathinfo傳遞的,id是通過get傳遞的

需要說明一點,在我們使用param()這個方法中進行獲取,它會返回我們post,get,以及我們pathinfo傳遞的所有值,也就是說,如果我們獲取到了get值,它也會預設合併到我們的param中。

下面說一種情況,如果我們的get中存在id,post中也傳入一個id,這個時候打印出param()的值,僅為兩位,這個時候param中的id的值是post傳遞過來的值。所以這樣給我們的程式在編寫或者在後期的維護過程中,會出現很多問題,同樣的取值,同樣的方式,它取得的值卻不是同一個地方的值。如果我們想解決這個問題,我們可以在前邊加上取值的型別(例如:input(‘post.id’)),其實這對應的就是$resquest->get(‘id’);如果我們獲取的是一個不存在的值,則會返回NULL,如果我們想給它一個預設值,我們就可以再給新增一個引數

作為預設值

現在如果我們想對sid進行過濾,比如說,需要傳遞sid為一個整形的時候,我們可能需要對他進行一個強制型別轉化,此時我們可以傳遞第三個引數,叫’intval’,在php中就是轉為整形的意思

Input()可以獲取到哪些型別的額資料呢?

有:post,get,param,session,put,file,path等等,其實我們在剛才的助手函式中就可以看到它可以獲取哪些型別的資料

如果傳遞的email不存在,我們依然可以新增第二個引數作為預設值input(‘session.email’,’[email protected]’);

響應物件Response

我們只帶http請求是,每個請求會對應一個響應,我們的額伺服器會對我們的請求作出相應的響應,我們可以在請求中獲取所有的請求資訊,那麼我們該如何來控制我們的響應呢?thinkphp為我們提供了響應物件,我們這裡不對響應物件做過詳細的講解,我們通過調整一些簡單的引數,來讓我們的response或者來讓我們的程式返回不同的結果。比如說我們現在為App開發介面,那麼我們可能需要的響應物件是一個Json或者是一個xml,如果現在我們是一個Ajax請求,那麼我們肯能期望的響應是Json或xml以及html格式.如果我們現在做一個企業官網,那麼我們可能只期望我們的響應物件是一個html就可以了。

現在看下邊的程式碼,我在index/Index/index下定義一個數組

我們會在瀏覽器中得到一個html格式的結果,說明我們當前的響應為一個html響應。

其實在這個我們是不期望用echo 列印東西的,還有不用die()這些東西。因為我們的控制器最終會返回一個值,這個值需要在我們的response物件中進行處理,如果我們直接用die(),我們的程式是沒有任何的問題,但是我們的響應就會發生一些問題。所以在我們的thinkphp5中,它不允許我們在程式中直接用die()。我們可以通過return的方式進行返回

我們來看一下是什麼控制了我們的輸出型別呢?

還是開啟框架的convention.php,找到

然後你看我下邊的程式碼

我們我們想將輸出格式改成xml格式,就可以將json改成xml

那這些有什麼用處呢?我們來舉一個實際應用的例子

比如說我們現在需要給我們的api寫介面,我們可能在我們的app目錄下,直接新建一個模組叫api

我在裡邊寫了一個Index.php檔案

現在我們直接訪問這個api/Index/getUser()方法,會報錯。報錯說我們的當前型別是array型別。我們期望返回的是一個html,html我們返回的應該是一個字串,但我們當前返回的是陣列,所以它無法解析會報錯。我們可以通過改變它的型別,可以在conf下建立api/config.php這個配置檔案,在前邊講過,在conf下建立與模組名相同的資料夾下為配置檔案,僅對改模組起作用。同時我們也可以使用一個簡單的方法進行配置,就是直接在改控制器下用Config::set()進行動態配置

在我們最終使用的時候一般不使用新增配置檔案這種方式,因為在我們修改配置檔案的時候,將Json修改成了xml時,那麼所有的介面都會變成xml,那麼我們已經發布的app可能就會存在問題。所以我們一般再給getUser()函式傳遞一個$type引數,讓其預設值為Json,然後我們再在函式體中進行判斷,最後我們使用動態的配置方式,具體看下邊的截圖

如果想得到xml格式的,我們可以在請求地址後加上‘?type=xml’

相關推薦

TP5.0學習筆記---請求響應

請求物件Request 我們知道Thinkphp是一個單入口的框架,所有的請求都進入index.php,我們通過index.php來接收所有的http請求,那麼請求中所有的引數,我們都可以同過Request這個物件來接收和處理。 在thinkphp中我們又三種方法可以讓我們

TP5.0學習筆記---URL路由

入口檔案 我們都知道thinkphp是一個單入口框架,它所有的請求都通過public/index.php進入,之後通過攜帶不同的引數,轉發到相應的控制器中來實現不同的功能。 單入口檔案:應用程式的所有http請求都由某一個檔案接受並由這個檔案轉發到功能程式碼中 單入口優勢

TP5.0學習筆記---模型(一)》

一、什麼是模型 為什麼我們要在專案中使用模型,其實我們知道,我們可以直接在控制器中進行資料庫的增、刪、改、查,其實已經能基本完成我們的需求,但是,為什麼還要有模型的存在呢? 比如說我們現在要做一個使用者註冊的操作,使用者註冊我們可能用兩個表來

django-rest-framework筆記-請求響應

python ica ror nic patch cnblogs coo fix ria 一、請求對象 request.POST # 處理表單數據. 限於POST請求. request.data # 處理任意數據. 對 ‘POST‘, ‘PUT‘ and ‘

TP5.0學習筆記---百度地圖封裝》

我們常常需要根據地址來獲取經緯度,根據經緯度來調取百度地圖等。 一、 根據地址獲取經緯度類的封裝 1, 獲取第三方介面 2, 編寫map類 3, 測試 1, 獲取第三方介面

ThinkPHP5學習筆記(6)請求響應

thinkphp在線視頻課程:http://www.kancloud.cn/tpshop/thinkphp5/220692Request請求對象和Response響應對象$_GET、$_POST、$_REQUEST、$_COOKIE調用請求對象$request=Request::instance()$this

TP5.0 請求響應

今天這篇文章主要寫一下tp5.0的請求(request)和響應(response)。關於更多TP5.0的內容請參見[我的部落格列表] ThinkPHP5 的架構設計和之前版本的主要區別之一就在於增加了 Request 請求物件和 Response 響

HTTP學習記錄:四、頭資訊(請求響應

學習資源主要為:@小坦克HTTP相關部落格 一、請求頭資訊(Request Header) 請求頭資訊包含比較多,如下: 1、Cache頭域   if-modified-Since   作用:把瀏覽器端快取頁面的最後修改時間傳送到伺服器去,伺服器會把這個時間與伺服器上的實際檔案的最後修改時間進行對比

Opengl es2.0 學習筆記(API)所有API的翻譯

包含了 gl2.h 和egl.h兩個標頭檔案 gl2.h gl2資料結構 /*------------------------------------------------------------------------- * Data type defi

OAuth 2.0系列教程(十一) 客戶端證書請求響應

作者:Jakob Jenkov   譯者:林浩    校對:郭蕾 客戶端證書授權包含下面的引數: grant_type 必須。必須設定到客戶端證書中。 scope 可選。授權的作用域。 客戶端授權響應: 客戶端授權響應包含下面的引數: { "access_token" :

OAuth 2.0系列教程(九) 契約請求響應

作者:Jakob Jenkov   譯者:林浩    校對:郭蕾 契約請求和響應 契約授權包含一個請求和一個響應。 契約授權請求 契約授權請求包含下面的引數: response_type 必須。必須被設定在令牌中。 client_id 必須。當客戶端被註冊時,有授權伺服器分配的客戶

OAuth 2.0系列教程(七) 請求響應

作者:Jakob Jenkov   譯者:林浩    校對:郭蕾 當客戶端應用請求授權和訪問令牌時,它傳送http請求到授權伺服器,同它的授權和令牌端點。被髮送來回的請求和響應取決於授權型別。記住,這四種授權型別: 授權碼授權 契約授權 資源擁有者金鑰證書授權 客戶端證書授權 每一種授權

零基礎開發OpenGL ES 2.0學習筆記-Android(一)

看到蘋果應用商店的火爆,也想做點東西放在上面,現在終於有點時間,可是發現用到的技術都不會,要學的東西很多呀(真是落伍了)~ 身為一個JAVA程式設計師,IOS完全不懂,Android只會一些皮毛,OpenGL更是一竅不通。 所有的東西肯定都是以JAVA思想來寫,摻雜著自己的

Opengl es2.0 學習筆記(十)VBO、IBOFBO

VBO:頂點緩衝,也就是說把頂點的儲存在 顯示卡中開闢記憶體,提高傳遞的效率。也可以說叫頂點座標的 緩衝區。 //建立vbo glGenBuffers(1,&_vbo); //繫結vbo glBindBuffer(GL_ARRAY_BUFFER,_vbo

Struts2.0學習筆記--Session的建立使用方法

在Struts2裡,如果需要在Action中使用session,可以通過下面兩種方式得到 1.通過ActionContext class中的方法getSession得到 2.Action實現org.apache.struts2.interceptor.SessionAware介面的方式來對session進

【Asp.net MVC4.0學習筆記】找不到DbContext無法檢索元資料

編譯環境:Visual Studio 2012; 解決問題:找不到DbContext需要安裝EntityFramework,安裝方法如下:      工具->庫程式包管理器->程式包管理器控制檯,開啟控制檯後,輸入命令Install-package Ent

ThinkPHP5 ---基礎(請求響應)

一、請求物件Requesti. 單入口public/index.php  此檔案接收http請求 請求中的所有引數都可以通過Request物件接收 處理ii. 三種獲取request物件的方法1. 助手函式request()  2. use think\Request ; R

Netty學習筆記(番外) - ChannelHandler、ChannelPipelineChannelHandlerContext的聯絡

> 這一篇是 [ChannelHandler 和 ChannelPipeline](https://www.cnblogs.com/niklai/p/12951811.html) 的番外篇,主要從原始碼的角度來學習 ChannelHandler、ChannelHandler 和 ChannelPipel

ECMAScript 6.0 學習筆記

企業 編寫 lan 語言 http targe 程序 blank es6 ECMAScript 6入門 1、ECMAScript 6.0(也就是ES2015 以下簡稱 ES6)是 JavaScript 語言的下一代標準,已經在2015年6月正式發布了。它的目標,是使得 J

thphp5.0學習筆記(一)

mic tel 序號 app clas world char p s 庫類 1.目錄結構: 其中thinkphp子目錄是框架核心目錄 thinkphp結構: 2.入口文件 默認自帶的入口文件位於public/index.php 應用目錄為application,其結構