說(shuō)明
獲得請(qǐng)求對(duì)象
webman會(huì)自動(dòng)將請(qǐng)求對(duì)象注入到action方法第一個(gè)參數(shù)中,例如
例子
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$default_name = 'webman';
// 從get請(qǐng)求里獲得name參數(shù),如果沒(méi)有傳遞name參數(shù)則返回$default_name
$name = $request->get('name', $default_name);
// 向?yàn)g覽器返回字符串
return response('hello ' . $name);
}
}
通過(guò)$request
對(duì)象我們能獲取到請(qǐng)求相關(guān)的任何數(shù)據(jù)。
有時(shí)候我們想在其它類中獲取當(dāng)前請(qǐng)求的$request
對(duì)象,這時(shí)候我們只要使用助手函數(shù)request()
即可;
獲得請(qǐng)求參數(shù)get
獲取整個(gè)get數(shù)組
$request->get();
如果請(qǐng)求沒(méi)有g(shù)et參數(shù)則返回一個(gè)空的數(shù)組。
獲取get數(shù)組的某一個(gè)值
$request->get('name');
如果get數(shù)組中不包含這個(gè)值則返回null。
你也可以給get方法第二個(gè)參數(shù)傳遞一個(gè)默認(rèn)值,如果get數(shù)組中沒(méi)找到對(duì)應(yīng)值則返回默認(rèn)值。例如:
$request->get('name', 'tom');
獲得請(qǐng)求參數(shù)post
獲取整個(gè)post數(shù)組
$request->post();
如果請(qǐng)求沒(méi)有post參數(shù)則返回一個(gè)空的數(shù)組。
獲取post數(shù)組的某一個(gè)值
$request->post('name');
如果post數(shù)組中不包含這個(gè)值則返回null。
與get方法一樣,你也可以給post方法第二個(gè)參數(shù)傳遞一個(gè)默認(rèn)值,如果post數(shù)組中沒(méi)找到對(duì)應(yīng)值則返回默認(rèn)值。例如:
$request->post('name', 'tom');
獲得原始請(qǐng)求post包體
$post = $request->rawBody();
這個(gè)功能類似與 php-fpm
里的 file_get_contents("php://input");
操作。用于獲得http原始請(qǐng)求包體。這在獲取非application/x-www-form-urlencoded
格式的post請(qǐng)求數(shù)據(jù)時(shí)很有用。
獲取header
獲取整個(gè)header數(shù)組
$request->header();
如果請(qǐng)求沒(méi)有header參數(shù)則返回一個(gè)空的數(shù)組。注意所有key均為小寫。
獲取header數(shù)組的某一個(gè)值
$request->header('host');
如果header數(shù)組中不包含這個(gè)值則返回null。注意所有key均為小寫。
與get方法一樣,你也可以給header方法第二個(gè)參數(shù)傳遞一個(gè)默認(rèn)值,如果header數(shù)組中沒(méi)找到對(duì)應(yīng)值則返回默認(rèn)值。例如:
$request->header('host', 'localhost');
獲取cookie
獲取整個(gè)cookie數(shù)組
$request->cookie();
如果請(qǐng)求沒(méi)有cookie參數(shù)則返回一個(gè)空的數(shù)組。
獲取cookie數(shù)組的某一個(gè)值
$request->cookie('name');
如果cookie數(shù)組中不包含這個(gè)值則返回null。
與get方法一樣,你也可以給cookie方法第二個(gè)參數(shù)傳遞一個(gè)默認(rèn)值,如果cookie數(shù)組中沒(méi)找到對(duì)應(yīng)值則返回默認(rèn)值。例如:
$request->cookie('name', 'tom');
獲得所有輸入
包含了post
get
的集合。
$request->all();
獲取指定輸入值
從post
get
的集合中獲取某個(gè)值。
$request->input('name', $default_value);
獲取部分輸入數(shù)據(jù)
從post
get
的集合中獲取部分?jǐn)?shù)據(jù)。
// 獲取 username 和 password 組成的數(shù)組,如果對(duì)應(yīng)的key沒(méi)有則忽略
$only = $request->only(['username', 'password']);
// 獲得除了avatar 和 age 以外的所有輸入
$except = $request->except(['avatar', 'age']);
通過(guò)控制器參數(shù)獲得輸入
注意
此特性需要 webman-framework >= 1.6.0
<?php
namespace app\controller;
use support\Response;
class UserController
{
public function create(string $name, int $age = 18): Response
{
return json(['name' => $name, 'age' => $age]);
}
}
代碼邏輯類似于
<?php
namespace app\controller;
use support\Request;
use support\Response;
class UserController
{
public function create(Request $request): Response
{
$name = $request->input('name');
$age = (int)$request->input('age', 18);
return json(['name' => $name, 'age' => $age]);
}
}
更多信息請(qǐng)參考控制器參數(shù)綁定
獲取上傳文件
提示
上傳文件需要使用multipart/form-data
格式的表單
獲取整個(gè)上傳文件數(shù)組
$request->file();
表單類似:
<form method="post" action="http://127.0.0.1:8787/upload/files" enctype="multipart/form-data" />
<input name="file1" multiple="multiple" type="file">
<input name="file2" multiple="multiple" type="file">
<input type="submit">
</form>
$request->file()
返回的格式類似:
array (
'file1' => object(webman\Http\UploadFile),
'file2' => object(webman\Http\UploadFile)
)
他是一個(gè)webman\Http\UploadFile
實(shí)例的數(shù)組。webman\Http\UploadFile
類繼承了 PHP 內(nèi)置的 SplFileInfo
類,并且提供了一些實(shí)用的方法。
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function files(Request $request)
{
foreach ($request->file() as $key => $spl_file) {
var_export($spl_file->isValid()); // 文件是否有效,例如ture|false
var_export($spl_file->getUploadExtension()); // 上傳文件后綴名,例如'jpg'
var_export($spl_file->getUploadMimeType()); // 上傳文件mine類型,例如 'image/jpeg'
var_export($spl_file->getUploadErrorCode()); // 獲取上傳錯(cuò)誤碼,例如 UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
var_export($spl_file->getUploadName()); // 上傳文件名,例如 'my-test.jpg'
var_export($spl_file->getSize()); // 獲得文件大小,例如 13364,單位字節(jié)
var_export($spl_file->getPath()); // 獲得上傳的目錄,例如 '/tmp'
var_export($spl_file->getRealPath()); // 獲得臨時(shí)文件路徑,例如 `/tmp/workerman.upload.SRliMu`
}
return response('ok');
}
}
注意:
- 文件被上傳后會(huì)被命名為一個(gè)臨時(shí)文件,類似
/tmp/workerman.upload.SRliMu
- 上傳文件大小受到defaultMaxPackageSize限制,默認(rèn)10M,可在
config/server.php
文件中修改max_package_size
更改默認(rèn)值。 - 請(qǐng)求結(jié)束后臨時(shí)文件將被自動(dòng)清除
- 如果請(qǐng)求沒(méi)有上傳文件則
$request->file()
返回一個(gè)空的數(shù)組 - 上傳的文件不支持
move_uploaded_file()
方法,請(qǐng)使用$file->move()
方法代替,參見(jiàn)下面的例子
獲取特定上傳文件
$request->file('avatar');
如果文件存在的話則返回對(duì)應(yīng)文件的webman\Http\UploadFile
實(shí)例,否則返回null。
例子
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function file(Request $request)
{
$file = $request->file('avatar');
if ($file && $file->isValid()) {
$file->move(public_path().'/files/myfile.'.$file->getUploadExtension());
return json(['code' => 0, 'msg' => 'upload success']);
}
return json(['code' => 1, 'msg' => 'file not found']);
}
}
獲取host
獲取請(qǐng)求的host信息。
$request->host();
如果請(qǐng)求的地址是非標(biāo)準(zhǔn)的80或者443端口,host信息可能會(huì)攜帶端口,例如example.com:8080
。如果不需要端口第一個(gè)參數(shù)可以傳入true
。
$request->host(true);
獲取請(qǐng)求方法
$request->method();
返回值可能是GET
、POST
、PUT
、DELETE
、OPTIONS
、HEAD
中的一個(gè)。
獲取請(qǐng)求uri
$request->uri();
返回請(qǐng)求的uri,包括path和queryString部分。
獲取請(qǐng)求路徑
$request->path();
返回請(qǐng)求的path部分。
獲取請(qǐng)求queryString
$request->queryString();
返回請(qǐng)求的queryString部分。
獲取請(qǐng)求url
url()
方法返回不帶有Query
參數(shù) 的 URL。
$request->url();
返回類似//www.wtbis.cn/workerman-chat
fullUrl()
方法返回帶有Query
參數(shù) 的 URL。
$request->fullUrl();
返回類似//www.wtbis.cn/workerman-chat?type=download
注意
url()
和fullUrl()
沒(méi)有返回協(xié)議部分(沒(méi)有返回http或者h(yuǎn)ttps)。
因?yàn)闉g覽器里使用//example.com
這樣以//
開(kāi)頭的地址會(huì)自動(dòng)識(shí)別當(dāng)前站點(diǎn)的協(xié)議,自動(dòng)以http或https發(fā)起請(qǐng)求。
如果你使用了nginx代理,請(qǐng)將 proxy_set_header X-Forwarded-Proto $scheme;
加入到nginx配置中,參考nginx代理,
這樣就可以用$request->header('x-forwarded-proto');
來(lái)判斷是http還是https,例如:
echo $request->header('x-forwarded-proto'); // 輸出 http 或 https
獲取請(qǐng)求HTTP版本
$request->protocolVersion();
返回字符串 1.1
或者1.0
。
獲取請(qǐng)求sessionId
$request->sessionId();
返回字符串,由字母和數(shù)字組成
獲取請(qǐng)求客戶端IP
$request->getRemoteIp();
獲取請(qǐng)求客戶端端口
$request->getRemotePort();
獲取請(qǐng)求客戶端真實(shí)IP
$request->getRealIp($safe_mode=true);
當(dāng)項(xiàng)目使用代理(例如nginx)時(shí),使用$request->getRemoteIp()
得到的往往是代理服務(wù)器IP(類似127.0.0.1
192.168.x.x
)并非客戶端真實(shí)IP。這時(shí)候可以嘗試使用$request->getRealIp()
獲得客戶端真實(shí)IP。
$request->getRealIp()
會(huì)嘗試從HTTP頭的x-real-ip
、x-forwarded-for
、client-ip
、x-client-ip
、via
字段中獲取真實(shí)IP。
由于HTTP頭很容偽造,所以此方法獲得的客戶端IP并非100%可信,尤其是
$safe_mode
為false時(shí)。透過(guò)代理獲得客戶端真實(shí)IP的比較可靠的方法是,已知安全的代理服務(wù)器IP,并且明確知道攜帶真實(shí)IP是哪個(gè)HTTP頭,如果$request->getRemoteIp()
返回的IP確認(rèn)為已知的安全的代理服務(wù)器,然后通過(guò)$request->header('攜帶真實(shí)IP的HTTP頭')
獲取真實(shí)IP。
獲取服務(wù)端IP
$request->getLocalIp();
獲取服務(wù)端端口
$request->getLocalPort();
判斷是否是ajax請(qǐng)求
$request->isAjax();
判斷是否是pjax請(qǐng)求
$request->isPjax();
判斷是否是期待json返回
$request->expectsJson();
判斷客戶端是否接受json返回
$request->acceptJson();
獲得請(qǐng)求的插件名
非插件請(qǐng)求返回空字符串''
。
$request->plugin;
此特性需要webman>=1.4.0
獲得請(qǐng)求的應(yīng)用名
單應(yīng)用的時(shí)候始終返回空字符串''
,多應(yīng)用的時(shí)候返回應(yīng)用名
$request->app;
因?yàn)殚]包函數(shù)不屬于任何應(yīng)用,所以來(lái)自閉包路由的請(qǐng)求
$request->app
始終返回空字符串''
閉包路由參見(jiàn) 路由
獲得請(qǐng)求的控制器類名
獲得控制器對(duì)應(yīng)的類名
$request->controller;
返回類似 app\controller\IndexController
因?yàn)殚]包函數(shù)不屬于任何控制器,所以來(lái)自閉包路由的請(qǐng)求
$request->controller
始終返回空字符串''
閉包路由參見(jiàn) 路由
獲得請(qǐng)求的方法名
獲得請(qǐng)求對(duì)應(yīng)的控制器方法名
$request->action;
返回類似 index
因?yàn)殚]包函數(shù)不屬于任何控制器,所以來(lái)自閉包路由的請(qǐng)求
$request->action
始終返回空字符串''
閉包路由參見(jiàn) 路由
重寫參數(shù)
有時(shí)候我們想重寫請(qǐng)求的參數(shù),例如將請(qǐng)求過(guò)濾,讓后重新賦值給請(qǐng)求對(duì)象,這時(shí)候我們可以使用setGet()
setPost()
setHeader()
方法。
提示
此特性需要webman-framework>=1.6.0
重寫GET參數(shù)
$request->get(); // 假設(shè)得到 ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // 最終得到 ['name' => 'tom']
注意
如例子所示,setGet()
是重寫所有GET參數(shù),setPost()
setHeader()
也是同樣的行為。
重寫POST參數(shù)
$post = $request->post();
foreach ($post as $key => $value) {
$post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // 得到過(guò)濾后的post參數(shù)
重寫HEADER參數(shù)
$request->setHeader(['host' => 'example.com']);
$request->header('host'); // 輸出 example.com