9.thinkphp的請求

請求對象

當前的請求對象由think\Request類負責,該類不需要單獨實例化調用,通常使用依賴注入即可。在其它場合則可以使用think\facade\Request靜態類操作。

項目里面應該使用app\Request對象,該對象繼承了系統的think\Request對象,但可以增加自定義方法或者覆蓋已有方法。項目里面已經在provider.php中進行了定義,所以你仍然可以和之前一樣直接使用容器和靜態代理操作請求對象。

構造方法注入

一般適用于沒有繼承系統的控制器類的情況。

<?phpnamespace app\index\controller;use think\Request;class Index 
{/*** @var \think\Request Request實例*/protected $request;/*** 構造方法* @param Request $request Request對象* @access public*/public function __construct(Request $request){$this->request = $request;}public function index(){return $this->request->param('name');}    
}

操作方法注入

另外一種選擇是在每個方法中使用依賴注入。

<?phpnamespace app\index\controller;use think\Request;class Index
{public function index(Request $request){return $request->param('name');}    
}

無論是否繼承系統的控制器基類,都可以使用操作方法注入。

靜態調用

在沒有使用依賴注入的場合,可以通過Facade機制來靜態調用請求對象的方法(注意use引入的類庫區別)。

<?phpnamespace app\index\controller;use think\facade\Request;class Index
{public function index(){return Request::param('name');}    
}

該方法也同樣適用于依賴注入無法使用的場合。

助手函數

為了簡化調用,系統還提供了request助手函數,可以在任何需要的時候直接調用當前請求對象。

<?phpnamespace app\index\controller;class Index
{public function index(){return request()->param('name');}
}

自定義請求對象

你可以在項目里面自定義Request對象,修改已有的方法或者增加新的方法,默認已經在項目里面為你準備了app\Request類,你只需要直接修改該類就可以為你的項目單獨自定義請求對象。

自定義請求對象不支持為多應用的某個應用自定義,只能是全局自定義,如果你需要為某個應用定義不同的請求對象,可以在入口文件里面修改。例如:

// 執行HTTP應用并響應
$request = new app\common\Request();
$http = (new App())->http;
$response = $http->run($request);
$response->send();
$http->end($response);

請求信息

1. Request對象支持全局變量的檢測、獲取和安全過濾,支持$_GET、$_POST...等;

2. 為了方便演示,這里一律使用Facade的靜態調用模式;

3. 使用has()方法,可以檢測全局變量是否已經設置:

Request::has('id', 'get');
Request::has('username', 'post');

它是以get的方式不存在,還是以post方式不存在呢?

然后顯示以get方式不存在。

如果改成name了呢

就變成了true

4. Request支持的所有變量類型方法,如下表:

5. param()變量方法是自動識別GET、POST等的當前請求,推薦使用;

//獲取請求為name的值,過濾
Request::param('name');//獲取所有請求的變量,以數組形式,過濾
Request::param();//獲取所有請求的變量(原始變量),不包含上傳變量,不過濾
Request::param(false);//獲取部分變量
Request::param(['name','age']);

怎么取出name的值呢,如下

如果param()不輸入指定的值,就是獲取所有值。

獲取部分值:

6.默認情況下,并沒有配置字符過濾器,可在app\Request.php配置;

protected $filter = ['htmlspecialchars'];

設置字符過濾(轉義),第二個為什么不轉移呢,是由于上面所說的

?//獲取所有請求的變量(原始變量),不包含上傳變量,不過濾
Request::param(false);

7.如果沒有設置字符過濾器,或者局部用別的字符過濾器,可以通過第三參數;

Request::param('name','','htmlspecialchars');Request::param('name','','strip_tags,strtolower');

如果設置了全局過濾器,那么這個局部過濾器就會把全局過濾器給替換掉。

如果兩個都想要的話,就加個逗號。

8.如果設置了全局字符過濾器,但又不想某個局部使用,可以只用null參數;

Request::param('name','',null)

9.如果獲取不到值,支持請求的變量設置一個默認值;

Request::param('name','默認值');

10.如果采用的是路由URL,也可以獲取到變量,但param::get()不支持路由變量;

Request::param('id');Request::route('id');Request::get('id'); //路由參數,get獲取不到

使用Request::get("id"),獲取不到。

使用Route呢?

就可以獲取。

那Request::get("id")可以獲取什么呢?只能獲取''?''后面的值

(一個就是獲取路由的id,一個是獲取網址的id)不管哪種id都可以通過param獲取。

11.使用only()方法,可以獲取指定的變量,也可以設置默認值;

Request::only(['id','name']);Request::only(['id'=>1,'name'=>'默認值']);

12.使用only()方法,默認是param變量,可以在第二參數設置GET、POST等;

Request::only(['id','name'],'post');

13.相反的except()方法,就是排除指定的變量;

Request::except('id,name');Request::except(['id','name']);Request::except(['id'=>1,'name'=>'默認值']);Request::except(['id','name'],'post');

14.使用變量修飾符,可以將參數強制轉換成指定的類型;

15./s(字符串)、/d(整型)、/b(布爾)、/a(數組)、/f(浮點);

Request::param('id/d');

14.15傳入的age目前只是字符串。

加個/d的話就是強制類型整型。

把網址改成abc之后就會變成0

助手函數

1.為了簡化操作,Request對象提供了助手函數;

input('?get.id'); //判斷get下的id是否存在
input('?post.name'); //判斷post下的name是否存在
input('param.name'); //獲取param下的name值
input('param.name', '默認值'); //默認值
input('param.name', '', 'htmlspecialchars'); //過濾器
input('param.id/d'); //設置強制轉換

===================================================================

Request對象支持獲取當前的請求信息,包括:

方法含義
host當前訪問域名或者IP
scheme當前訪問協議
port當前訪問的端口
remotePort當前請求的REMOTE_PORT
protocol當前請求的SERVER_PROTOCOL
contentType當前請求的CONTENT_TYPE
domain當前包含協議的域名
subDomain當前訪問的子域名
panDomain當前訪問的泛域名
rootDomain當前訪問的根域名
url當前完整URL
baseUrl當前URL(不含QUERY_STRING)
query當前請求的QUERY_STRING參數
baseFile當前執行的文件
rootURL訪問根地址
rootUrlURL訪問根目錄
pathinfo當前請求URL的pathinfo信息(含URL后綴)
ext當前URL的訪問后綴
time獲取當前請求的時間
type當前請求的資源類型
method當前請求類型
rule當前請求的路由對象實例

對于上面的這些請求方法,一般調用無需任何參數,但某些方法可以傳入true參數,表示獲取帶域名的完整地址,例如:

use think\facade\Request;
// 獲取完整URL地址 不帶域名
Request::url();
// 獲取完整URL地址 包含域名
Request::url(true);
// 獲取當前URL(不含QUERY_STRING) 不帶域名
Request::baseFile();
// 獲取當前URL(不含QUERY_STRING) 包含域名
Request::baseFile(true);
// 獲取URL訪問根地址 不帶域名
Request::root();
// 獲取URL訪問根地址 包含域名
Request::root(true);

注意domain方法的值本身就包含協議和域名

獲取當前控制器/操作

可以通過請求對象獲取當前請求的控制器/操作名。

方法含義
controller當前請求的控制器名
action當前請求的操作名

獲取當前控制器

Request::controller();

返回的是控制器的駝峰形式(首字母大寫),和控制器類名保持一致(不含后綴)。

如果需要返回小寫可以使用

Request::controller(true);

如果要返回小寫+下劃線的方式,可以使用

parse_name(Request::controller());

獲取當前操作

Request::action();

返回的是當前操作方法的實際名稱,如果需要返回小寫可以使用

Request::action(true);

如果要返回小寫+下劃線的方式,可以使用

parse_name(Request::action());

如果使用了多應用模式,可以通過下面的方法來獲取當前應用

app('http')->getName();

輸入變量

可以通過Request對象完成全局輸入變量的檢測、獲取和安全過濾,支持包括$_GET$_POST$_REQUEST$_SERVER$_SESSION$_COOKIE$_ENV等系統變量,以及文件上傳信息。

為了方便說明,本篇內容的所有示例代碼均使用Facade方式,因此需要首先引入

use think\facade\Request;

檢測變量是否設置

可以使用has方法來檢測一個變量參數是否設置,如下:

Request::has('id','get');
Request::has('name','post');

變量檢測可以支持所有支持的系統變量,包括get/post/put/request/cookie/server/session/env/file

變量獲取

變量獲取使用\think\Request類的如下方法及參數:

變量類型方法('變量名/變量修飾符','默認值','過濾方法')

變量類型方法包括:

方法描述
param獲取當前請求的變量
get獲取 $_GET 變量
post獲取 $_POST 變量
put獲取 PUT 變量
delete獲取 DELETE 變量
session獲取 SESSION 變量
cookie獲取 $_COOKIE 變量
request獲取 $_REQUEST 變量
server獲取 $_SERVER 變量
env獲取 $_ENV 變量
route獲取 路由(包括PATHINFO) 變量
middleware獲取 中間件賦值/傳遞的變量
file獲取 $_FILES 變量
all?V6.0.8+獲取包括 $_FILES 變量在內的請求變量,相當于param+file

獲取PARAM變量

PARAM類型變量是框架提供的用于自動識別當前請求的一種變量獲取方式,是系統推薦的獲取請求參數的方法,用法如下:

// 獲取當前請求的name變量
Request::param('name');
// 獲取當前請求的所有變量(經過過濾)
Request::param();
// 獲取當前請求未經過濾的所有變量
Request::param(false);
// 獲取部分變量
Request::param(['name', 'email']);

param方法會把當前請求類型的參數和路由變量以及GET請求合并,并且路由變量是優先的。

其它的輸入變量獲取方法和param方法用法基本一致。

你無法使用get方法獲取路由變量,例如當訪問地址是

http://localhost/index.php/index/index/hello/name/thinkphp

下面的用法是錯誤的

echo Request::get('name'); // 輸出為空

正確的用法是

echo Request::param('name'); // 輸出thinkphp

除了serverenv方法的變量名不區分大小寫(會自動轉為大寫后獲取),其它變量名區分大小寫。

默認值

獲取輸入變量的時候,可以支持默認值,例如當URL中不包含$_GET['name']的時候,使用下面的方式輸出的結果比較。

Request::get('name'); // 返回值為null
Request::get('name',''); // 返回值為空字符串
Request::get('name','default'); // 返回值為default

前面提到的方法都支持在第二個參數中傳入默認值的方式。

變量過濾

框架默認沒有設置任何全局過濾規則,你可以在app\Request對象中設置filter全局過濾屬性:

namespace app;class Request extends \think\Request
{protected $filter = ['htmlspecialchars'];
}

也支持使用Request對象進行全局變量的獲取過濾,過濾方式包括函數、方法過濾,以及PHP內置的Types of filters,我們可以設置全局變量過濾方法,支持設置多個過濾方法,例如:

Request::filter(['strip_tags','htmlspecialchars']),

也可以在獲取變量的時候添加過濾方法,例如:

Request::get('name','','htmlspecialchars'); // 獲取get變量 并用htmlspecialchars函數過濾
Request::param('username','','strip_tags'); // 獲取param變量 并用strip_tags函數過濾
Request::post('name','','org\Filter::safeHtml'); // 獲取post變量 并用org\Filter類的safeHtml方法過濾

如果當前不需要進行任何過濾的話,可以使用

// 獲取get變量 并且不進行任何過濾 即使設置了全局過濾
Request::get('name', '', null);

對于body中提交的json對象,你無需使用php://input去獲取,可以直接當做表單提交的數據使用,因為系統已經自動處理過了

獲取部分變量

如果你只需要獲取當前請求的部分參數,可以使用:

// 只獲取當前請求的id和name變量
Request::only(['id','name']);

采用only方法能夠安全的獲取你需要的變量,避免額外變量影響數據處理和寫入

only方法可以支持批量設置默認值,如下:

// 設置默認值
Request::only(['id'=>0,'name'=>'']);

表示id的默認值為0,name的默認值為空字符串。

默認獲取的是當前請求參數(PARAM類型變量),如果需要獲取其它類型的參數,可以在第二個參數傳入,例如:

// 只獲取GET請求的id和name變量
Request::only(['id','name'], 'get');
// 等效于
Request::get(['id', 'name']);
// 只獲取POST請求的id和name變量
Request::only(['id','name'], 'post');
// 等效于
Request::post(['id', 'name']);

也支持排除某些變量后獲取,例如

// 排除id和name變量
Request::except(['id','name']);

同樣支持指定變量類型獲取:

// 排除GET請求的id和name變量
Request::except(['id','name'], 'get');
// 排除POST請求的id和name變量
Request::except(['id','name'], 'post');

變量修飾符

支持對變量使用修飾符功能,可以一定程度上簡單過濾變量,更為嚴格的過濾請使用前面提過的變量過濾功能。

用法如下:

Request::變量類型('變量名/修飾符');

支持的變量修飾符,包括:

修飾符作用
s強制轉換為字符串類型
d強制轉換為整型類型
b強制轉換為布爾類型
a強制轉換為數組類型
f強制轉換為浮點類型

下面是一些例子:

Request::get('id/d');
Request::post('name/s');
Request::post('ids/a');

中間件變量

可以在中間件里面設置和獲取請求變量的值,這個值的改變不會影響PARAM變量的獲取。

<?phpnamespace app\http\middleware;class Check
{public function handle($request, \Closure $next){if ('think' == $request->name) {$request->name = 'ThinkPHP';}return $next($request);}
}

助手函數

為了簡化使用,還可以使用系統提供的input助手函數完成上述大部分功能。

判斷變量是否定義

input('?get.id');
input('?post.name');

獲取PARAM參數

input('param.name'); // 獲取單個參數
input('param.'); // 獲取全部參數
// 下面是等效的
input('name'); 
input('');

獲取GET參數

// 獲取單個變量
input('get.id');
// 使用過濾方法獲取 默認為空字符串
input('get.name');
// 獲取全部變量
input('get.');

使用過濾方法

input('get.name','','htmlspecialchars'); // 獲取get變量 并用htmlspecialchars函數過濾
input('username','','strip_tags'); // 獲取param變量 并用strip_tags函數過濾
input('post.name','','org\Filter::safeHtml'); // 獲取post變量 并用org\Filter類的safeHtml方法過濾

使用變量修飾符

input('get.id/d');
input('post.name/s');
input('post.ids/a');

請求類型

1. 有時,我們需要判斷Request的請求類型,比如GET、POST等等;

2. 可以使用method()方法來判斷當前的請求類型,當然,還有很多專用的請求判斷;

判斷GET請求:

判斷是否為POST請求:

3. 使用普通表單提交,通過method()方法獲取類型;

<form action="http://localhost/tp6/public/rely/get" method="post"><input type="text" name="name" value="Lee"><input type="submit" value="提交"></form>return Request::method();

根據這個來POST請求:

使用method方法獲取get還是post請求。

?return Request::method();

上面這個圖片雖然,method='put',但是識別的還是POST。

4. 在表單提交時,我們也可以設置請求類型偽裝,設置隱藏字段_method;

?

根據上面的操作才能變成PUT

5. 而在判斷請求,使用method(true)可以獲取原始請求,否則獲取偽裝請求;

<input type="hidden" name="_method" value="PUT">Request::method(true);

6. 如果想更改請求偽裝變量類型的名稱,可以在app/Request.php中更改;

protected $varMethod = '_m';

7. AJAX/PJAX 偽裝,使用?_ajax=1和?_pjax=1,并使用isAjax()和isPjax();

.../rely?_ajax=1Request::isAjax();

8. 這里需要用isAjax()和isPjax()來判斷,用method無法判斷是否為a(p)jax;

9. 在app.php也可以更改ajax和pjax的名稱;

protected $varAjax = '_a';protected $varPjax = '_p';

HTTP頭信息

1. 使用header()方法可以輸出HTTP頭信息,返回是數組類型,也可單信息獲取;?

Request::header();Request::header('host');

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76730.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76730.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java從入門到“放棄”(精通)之旅——方法的使用⑤

Java從入門到“放棄”&#xff08;精通&#xff09;之旅&#x1f680;——方法的使用⑤ &#x1f4d6;引言&#xff1a; 在編程領域&#xff0c;代碼如同精密的齒輪相互咬合驅動程序運轉。隨著項目規模漸長&#xff0c;重復的代碼片段如同冗余的齒輪&#xff0c;不僅增加負重…

鴻蒙NEXT開發格式化工具類(ArkTs)

import { i18n } from kit.LocalizationKit;/*** 格式化工具類* 提供電話號碼格式化、歸屬地查詢、字符轉換等功能。* author: 鴻蒙布道師* since: 2025/04/14*/ export class FormatUtil {/*** 判斷傳入的電話號碼格式是否正確。* param phone - 待驗證的電話號碼* param coun…

[Python基礎速成]2-模塊與包與OOP

上篇??[Python基礎速成]1-Python規范與核心語法 目錄 Python模塊創建模塊與導入屬性__name__dir()函數標準模塊 Python包類類的專有方法 對象繼承多態 Python模塊 Python 中的模塊&#xff08;Module&#xff09;是一個包含 Python 定義和語句的文件&#xff0c;文件名就是模…

OSI參考模型和TCP/IP模型

1.OSI參考模型 OSI模型&#xff1a; OSI參考模型有7層&#xff0c;自下而上依次為物理層&#xff0c;數據鏈路層&#xff0c;網絡層&#xff0c;傳輸層&#xff0c;會話層&#xff0c;表示層&#xff0c;應用層。&#xff08;記憶口訣&#xff1a;物聯網叔會用&#xff09;。低…

linux Shell編程之循環語句(三)

目錄 一. for 循環語句 1. for語句的結構 2. for 語句應用示例 (1) 根據姓名列表批量添加用戶 (2) 根據 IP 地址列表檢查主機狀態 二. 使用 while 循環語句 1. while 語句的結構 2. while 語句應用示例 (1) 批量添加規律編號的用戶 (2) 猜價格游戲 三. until 循環語…

最新扣子實戰教程,利用扣子平臺通過在線表格記錄,批量生圖,再也不要一條條的粘貼提示詞了

1、功能描述 大家好&#xff0c;我是濤濤。今天我要給大家講解如何在扣子平臺上對接飛書電子表格。由于多維表格相對復雜&#xff0c;而很多業務場景其實只需要電子表格就能滿足&#xff0c;因此今天我們將演示如何在扣子平臺上讀取飛書電子表格并批量生成圖片。 先看效果&am…

java -jar指定類加載

在 Java 中&#xff0c;使用 java -jar 命令運行 JAR 文件時&#xff0c;默認會加載 JAR 文件的 MANIFEST.MF 文件中指定的 Main-Class。如果你想在運行時指定一個類來加載&#xff0c;可以通過以下方式實現&#xff1a; 方法 1&#xff1a;直接指定類路徑和類名 如果你不想使用…

多模態思維鏈(Multimodal Chain of Thought, MCoT)六大技術支柱在醫療領域的應用

多模態思維鏈(Multimodal Chain of Thought, MCoT)通過整合文本、圖像、視頻等多模態數據,結合邏輯推理與深度學習技術,在醫療領域展現出強大的應用潛力。其六大技術支柱在醫療場景中的具體應用如下: 一、推理構建視角:醫學診斷的流程優化 MCoT通過多模態推理鏈生成技術…

從文本到視頻:基于擴散模型的AI生成系統全解析(附PyTorch實現)

當語言遇見動態視覺 "用文字生成電影場景"曾是科幻作品中的幻想&#xff0c;如今借助擴散模型&#xff08;Diffusion Models&#xff09;正逐步成為現實。本文將手把手帶你實現一個創新的文本到視頻生成系統&#xff0c;通過深度解析擴散模型原理&#xff0c;結合獨…

科普:如何通過ROC曲線,確定二分類的“理論閾值”

在二分類問題中&#xff0c;已知預測概率&#xff08;如邏輯回歸、神經網絡輸出的概率值&#xff09;時&#xff0c;閾值的選擇直接影響分類結果&#xff08;正/負樣本判定&#xff09;。 一、實踐中的閾值選擇方法 1. 基于業務目標的調整 最大化準確率&#xff1a;適用于樣…

2025ArkTS基礎UI(一)——Column、Row、Text、Button組件

2025ArkTS基礎UI(一)——Column、Row、Text、Button組件 前言 臭寶們&#xff0c;今天我們來學習ArkTS基礎UI組件的使用&#xff0c;其中包括&#xff1a; Column、Row、Text、Button組件。 知識點 Colum、Row組件用于布局&#xff0c;Text、Image、Button組件用于展示。 …

強化學習:基于價值的方法做的是回歸,基于策略的方法做的是分類,可以這么理解嗎?

在強化學習領域,基于價值的方法(Value-based Methods)和基于策略的方法(Policy-based Methods)是兩種核心范式。本文將從目標函數、優化機制以及與機器學習任務的類比角度,探討這兩種方法是否可以被分別理解為回歸和分類任務,并深入分析其內在邏輯。 一、基于價值的方法…

折疊屏手機:技術進步了,柔性OLED面板測試技術需求跟上了嗎?

全球智能手機市場陷入創新焦慮&#xff0c;折疊屏手機被寄予厚望&#xff0c;2023 年出貨量同比增長 62%。但在供應鏈技術狂歡背后&#xff0c;存在諸多問題。消費端數據顯示&#xff0c;用戶使用頻率低&#xff0c;定價策略反常。產業鏈重構雖讓部分企業獲利&#xff0c;卻推高…

前端在線工具 CodePen 和 JSFiddle

前端在線工具 CodePen 和 JSFiddle CodePen 概述&#xff1a;CodePen 是一個社交化的前端開發環境&#xff0c;用戶可以在這里創建代碼片段&#xff08;稱為“Pens”&#xff09;&#xff0c;分享和展示自己的前端開發作品。 主要功能&#xff1a; 實時預覽&#xff1a;用戶在…

Redis-場景緩存+秒殺+管道+消息隊列

緩存一致性 1.兩次更新 先更新數據庫&#xff0c;再更新緩存&#xff1b;先更新緩存&#xff0c;再更新數據庫&#xff1b; 出現不一致問題場景&#xff1a; 先更新數據庫&#xff0c;再更新緩存&#xff1b; 先更新緩存&#xff0c;再更新數據庫&#xff1b; 兩次更新的適…

[Windows] 字體渲染 mactype v2025.4.11

[Windows] 字體渲染 mactype 鏈接&#xff1a;https://pan.xunlei.com/s/VONeCUP2hEgO5WIQImgtGUmrA1?pwdyruf# 025.4.11 Variable font support 可變字體支持已到來。 本版本將可變字體支持擴展到所有 GDI 應用程序。 所有 win32 程序中的字體&#xff0c;如 Noto Sans、Se…

【C++】深拷貝與淺拷貝

重開也不是不可能 ~.~ 淺拷貝 #include <iostream> #include <cstring>class ShallowCopyExample { public:int m_nValue;int* m_pData;// 構造函數&#xff0c;初始化指針成員ShallowCopyExample(int value) : m_nValue(value) {m_pData new int(0);*m_pData va…

SpringBoot企業級開發之【用戶模塊-更新用戶頭像】

功能如下所示&#xff1a; 我們先看一下接口文檔&#xff1a; 為什么頭像是一串字符串呢&#xff1f;因為我們是將頭像圖片放到第三方去存儲&#xff0c;比如&#xff1a;阿里云等 開發思路&#xff1a; 實操&#xff1a; 1.controller 注意!這里使用【PatchMapping】注解…

vue3+vite+js項目引入electron構建跨平臺桌面應用

1.準備工作 ① 必要安裝node.js、vue、vite、electron、pnpm 本人用的node版本v18.17.1、vue版本^3.4.19、vite版本^3.2.7、electron版本^35.1.4 ② 開發調試打包安裝 "devDependencies": {"concurrently": "^9.1.2","electron-builder&…

(51單片機)串口通訊(串口通訊教程)(串口接收發送教程)

前言&#xff1a; 今天有兩個項目&#xff0c;分別為&#xff1a; 串口接收: 串口發送&#xff1a; 如上圖將文件放在Keli5 中即可&#xff0c;然后燒錄在單片機中就行了 燒錄軟件用的是STC-ISP&#xff0c;不知道怎么安裝的可以去看江科大的視頻&#xff1a; 【51單片機入門…