初识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)的更多相关文章
- 初识thinkphp(5)
这次主要内容是模型的基本操作 0x01:什么是模型 通过手册的阅览,笼统的说就是,把打开数据库等操作在另一个php文件中进行 以及对变量的规则具体细节,查询,取值等操作进行定义,方便在控制器中直接使用 ...
- 初识thinkphp(4)
这次内容是数据库的使用方法 因为在第一章讲过就是拿index这个文件写的数据库的访问,这次实验我使用文件是系统默认的首页 配置的内容也在那里有提过就不重发戳图了. 数据库按照手册上的建议建了3行的内容 ...
- 初识thinkphp(2)
thinkphp的url路径的表示格式为 http://ip/tp/public/index.php/模块/控制器/操作 这里url最后的操作就是类里面的函数. 0x01:url访问格式 官方文档中有 ...
- 初识thinkphp(1)
作为一名准备成为CTF里WEB狗的萌新,在做了3个月的CTF的web题后,发现自己php代码审计非常不过关,并且web的架构模式条理也十分的不清晰,于是抱着提高代码审计能力的态度在近期会去写一个简单的 ...
- ThinkPHP学习笔记(一)----初识ThinkPHP
在做微信开发的时候原本使用来yii框架,后续觉得yii虽然功能强大使用方便,但是整个框架太大了,不适合一些轻量级的开发:这个时候发现thinkphp这个框架,框架本身很小,只有几M,但麻雀虽小,但五脏 ...
- 使用ThinkPHP框架高速开发站点(多图)
使用ThinkPHP框架高速搭建站点 这一周一直忙于做实验室的站点,基本功能算是完毕了.比較有收获的是大概了解了ThinkPHP框架.写一些东西留作纪念吧.假设对于相同是Web方面新手的你有一丝丝帮助 ...
- 使用ThinkPHP框架高速发展网站(多图)
使用ThinkPHP框架高速搭建站点 这一周一直忙于做实验室的站点,基本功能算是完毕了.比較有收获的是大概了解了ThinkPHP框架.写一些东西留作纪念吧.假设对于相同是Web方面新手的你有一丝丝帮助 ...
- ThinkPHP Widget模块开发流程
初识ThinkPHP的Widget,现把模块开发的流程发布如下,也方便以后自己查阅: 一.新建数据库表self_modules,sql代码如下 CREATE TABLE `self_modules` ...
- [转]使用ThinkPHP框架快速开发网站(多图)
本文转自:http://blog.csdn.net/ruby97/article/details/7574851 这一周一直忙于做实验室的网站,基本功能算是完成了.比较有收获的是大概了解了ThinkP ...
随机推荐
- AdaBoost原理详解
写一点自己理解的AdaBoost,然后再贴上面试过程中被问到的相关问题.按照以下目录展开. 当然,也可以去我的博客上看 Boosting提升算法 AdaBoost 原理理解 实例 算法流程 公式推导 ...
- 纯干货!一款APP从设计稿到切图过程全方位揭秘(转)
@BAT_LCK :我本身是一名GUI设计师,所以我只站在GUI设计师的角度去把APP从项目启动到切片输出的过程写一写,相当于工作流程的介绍吧.公司不同,流程不尽相同,但是终究还是能有些帮助. 依旧声 ...
- Debian8 系统修改语言设置成英文
本文摘自 https://wiki.debian.org/ChangeLanguage ,感谢作者 * First, you have to set environment variables suc ...
- UDP ------ UDP 和 TCP 的对比
UDP是无连接协议,客户端和服务器通信之前不需要建立握手连接: UDP没有应答机制,所以也没有重发机制,很大的可能会造成丢包.收到重复包.乱序的情况: UDP可以实现局域网广播功能,即某个主机可以向所 ...
- SQL Server 性能优化详解
故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...
- HTML培训课程-------Day02(表格和框架)
表格 在网页中表格是一种经常使用到得设计结构,就像表格的内容中可以包含任何的数据,如文字.图像.表单.超链接.表格等等,所有在HTML中可以使用的数据,都可以被设置在表格中,所以有关表格设置的标记与属 ...
- 「Vue」父子组件之间的传值及调用方法
a.父组件向子组件传值data(){},props数据区别data中的数据可读可写,是自己的数据props是个数组,中的数据是父组件传递过来的,只读不能写<login :dmsg='msg'&g ...
- Flink流处理操作符
一.工程创建与准备 使用maven进行工程创建,且采用提供的flink-quickstart模版,便利很多.
- oracle connect by用法篇 (转)
1.基本语法 select * from table [start with condition1] connect by [prior] id=parentid 1 2 1 2 一般用来查找存在父子 ...
- bzoj千题计划239:bzoj4069: [Apio2015]巴厘岛的雕塑
http://www.lydsy.com/JudgeOnline/problem.php?id=4069 a!=1: 从高位到低位一位一位的算 记录下哪些位必须为0 dp[i][j] 表示前i个数分为 ...