初識thinkphp(3)
這篇內容主要涉及請求相應內容。
該系列主要是個人筆記,且內容是連貫的,其中涉及到的自己寫的模塊或者方法在前面文章中有介紹咋來的,如果您看得雲裏霧裏,給您帶來不便,真的不好意思。
0x01:請求對象
官方的內容是為了安全和統一,而引用Request對象
學過編程語言的都不陌生面向對象程序設計,而我們的Request大概就是C++中說所的類的概念
我們在之前創建的demo模塊中的helloword控制器中創建操作req(),並在router路由中添加路由信息
<?php
namespace app\demo\controller;
use think\Request;
class HelloWorld
{
public function helloworld()
{
return "Hello World";
}
public function hello($name=‘yayayayaya‘)
{
return "Hello thinkphp ". $name;
}
public function req()
{
$request = Request::instance();
echo ‘url : ‘ . $request->url() . ‘<br/>‘;
return ;
}
}
查看回顯:
這裏發現它返回的不是絕對路徑,而是走的我們之前設置好的路由的路徑
如果訪問它的絕對路徑
可以確定 Request中的url()方法返回的是輸入的url的路徑信息。
另一種方法,我們直接繼承Controllel類(估計這個類含有Request對象)
在類裏面用this指針訪問繼承下來的request對象的url()函數
這裏方便起見,我把自己寫的毫無用處的helloworld方法給刪了
<?php namespace app\demo\controller; use think\Controller; class HelloWorld extends Controller {public function hello($name=‘yayayayaya‘) { return "Hello thinkphp ". $name; } public function req() { echo ‘url : ‘ . $this->request->url() . ‘<br/>‘; return ; } }
回顯效果同上~
官方建議方式是直接在參數中添加該對象,並且這裏不用賦初識值都行。
<?php namespace app\demo\controller;use think\Request; class HelloWorld { public function hello($name=‘yayayayaya‘) { return "Hello thinkphp ". $name; } public function req(Request $req) { echo ‘url : ‘ . $req->url() . ‘<br/>‘; return ; } }
回顯內容還是同上~
這裏我最開始認為這不和第一個方法相同嗎,我就直接把Request $req丟入req方法裏面,結果報錯。
仔細一想,helloworld類又沒有繼承Request是無法類裏面方法直接聲明的。而官方推薦方法在參數位置申明,是從外部調用的並不需要繼承。
這樣回頭來看,第一種方法即使通過作用域Request::來調用instance()
這個類比像Java中的"new {類名}"之類的操作。
還提供了2種發法,了解能用就好了吧
這裏沒有用use 引入,直接調用助手函數來達到目的
<?php namespace app\demo\controller; class HelloWorld { public function hello($name=‘yayayayaya‘) { return "Hello thinkphp ". $name; } public function req() { echo ‘url : ‘ . request()->url() . ‘<br/>‘; return ; } }
這裏只要聲明下作用域為Request類就能訪問該類裏面的公有方法url()
<?php namespace app\index\controller; use think\facade\Request; class Index { public function hello($name = ‘World‘) { // 獲取當前URL地址 不含域名 echo ‘url: ‘ . Request::url() . ‘<br/>‘; return ‘Hello,‘ . $name . ‘!‘; } }
0x02:請求信息
在說這個內容的時候,我們需要了解下Request這個類是來存放$_GET
、$_POST
、$_REQUEST
、$_SESSION
、$_COOKIE
,$_FILES這些"數組"中的信息的,我們可以把它當做Request包含著這些"數組"的各個鍵值對的映射內容。
那麽在這裏我們就要來訪問,Request這個裏面所包含的鍵值對的信息。
我們用param方法來實現。
<?php namespace app\demo\controller; use think\Request; class HelloWorld { public function hello($name=‘yayayayaya‘) { return "Hello thinkphp ". $name; } public function req(Request $req) { var_dump($req->param()); return ; } }
回顯:
我們這些請求都是get請求,我們傳幾個參數進去。
數組裏面有內容了。
也可以直接調用相應信息的"數組"的方法:
<?php namespace app\demo\controller; use think\Request; class HelloWorld { public function hello($name=‘yayayayaya‘) { return "Hello thinkphp ". $name; } public function req(Request $req) { var_dump($req->param()); echo "<br>"; var_dump($req->get()); echo "<br>"; var_dump($req->post()); return ; } }
回顯內容:
之前也說了,因為這個是GET所以這裏的post()方法被調用了內容也是空,我們試著用hackbar發點數據過去
POST裏面也有值了。
使用助手函數input也可以達到類似於以上效果
從官方手冊上戳一個表
這裏再介紹幾種Request的方法
method()請求方式,一般就是POST和GET顯示
type()資源類型html/php/jsp之類的
ip()訪問者ip
only([ 只有該鍵的信息被調用 ])
except([ 只有該鍵的信息不被調用 ])
這裏的方法我試著用了些,顯示結果就不貼圖了
還可以進行以下操作
還可以獲取當前模塊的信息
module()模塊名
controller()控制器名
action()操作名
routeinfo()路由信息(我試了,加了路由,為啥返回是空數組qwq)
dispatch()調度信息
0x03:響應對象
有傳給服務器的信息,那麽就有服務器傳給用戶的信息。而respond這個響應對象就是對這個個操作。
這裏是內容與thinkphp5無關,只是作者聯想到的內容:看到 respond和request,想到用wrieshark對pcap包過濾請求和響應方式的時候就有request.method和rospond.code之類的過濾條件,看到這裏對wrieshark也有了一些理解吧。
回到正題,thinkphp5會根據響應來判斷是ajax(js和xml)還是普通的通過default_return_type和default_ajax_return
我們可以瞧瞧這2個值的屬性,在application\config.php中
也就是說我們這裏說的respond響應的default_return_type大致可以理解成我們的return的內容。
下面添加一個新的操作(方法)
返回單個值是正常的。
返回數組會報錯。
修改下我們上面的defaul_return_type就正確的可以顯示了。
或者不修改配置文件,寫成這樣也是可以的。
然後我們還可以規定修改響應頭的參數,CTF中有些web題的信息大概可以通過這種方式加到響應頭裏去吧(笑)
我們再次訪問resp操作看看我們的響應頭
官方給出可以進行操作的樣式有這些。
頁面跳轉功能,在客戶端輸入正確的參數的時候我們給予相應正確的跳轉,反之我們給予錯誤的跳轉。
如果var是sijidou就跳轉之前寫的req()方法中,否則跳到寫的resp()方法中
這裏有個註意 use \traits\controller\Jump應放在類裏面,如果放在類外面,他會報錯
然後就是重定向了,這個重定向可以支持用use \traits\controller\Jump來調用,也可以使用助手函數redirect()來完成,這裏我們演示下使用use \traits\controller\Jump來調用,重定向到百度是可以實現的。
這裏我輸百度的url的時候,最先沒加http://頭,報錯說找不到www.baidu.com模塊,顯然,它是走的自身模塊去匹配,那麽要跳轉到不是我這個系統的網站,那麽要加上http://之類的請求頭。
初識thinkphp(3)