zoukankan      html  css  js  c++  java
  • 初识thinkphp(3)

    这篇内容主要涉及请求相应内容。

    该系列主要是个人笔记,且内容是连贯的,其中涉及到的自己写的模块或者方法在前面文章中有介绍咋来的,如果您看得云里雾里,给您带来不便,真的不好意思。

    0x01:请求对象

    官方的内容是为了安全和统一,而引用Request对象

    学过编程语言的都不陌生面向对象程序设计,而我们的Request大概就是C++中说所的类的概念

    我们在之前创建的demo模块中的helloword控制器中创建操作req(),并在router路由中添加路由信息

     <?php
    namespace appdemocontroller;

    use thinkRequest;

    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 appdemocontroller;
    
    use thinkController;
    
    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 appdemocontroller;
    
    use thinkRequest;
    
    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 appdemocontroller;
    
    
    class HelloWorld
    {
        public function hello($name='yayayayaya')
        {
            return "Hello thinkphp ". $name;
        }
        public function req()
        {
            echo 'url : ' . request()->url() . '<br/>';
            return ;
        }
    }

    这里只要声明下作用域为Request类就能访问该类里面的公有方法url()

    <?php
    namespace appindexcontroller;
    
    use thinkfacadeRequest;
    
    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 appdemocontroller;
    use thinkRequest;
    
    class HelloWorld
    {
        public function hello($name='yayayayaya')
        {
            return "Hello thinkphp ". $name;
        }
        public function req(Request $req)
        {
            var_dump($req->param());
            return ;
        }
    }

    回显:

    我们这些请求都是get请求,我们传几个参数进去。

    数组里面有内容了。

     也可以直接调用相应信息的"数组"的方法:

    <?php
    namespace appdemocontroller;
    use thinkRequest;
    
    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个值的属性,在applicationconfig.php中

    也就是说我们这里说的respond响应的default_return_type大致可以理解成我们的return的内容。

    下面添加一个新的操作(方法)

    返回单个值是正常的。

    返回数组会报错。

     修改下我们上面的defaul_return_type就正确的可以显示了。

    或者不修改配置文件,写成这样也是可以的。

    然后我们还可以规定修改响应头的参数,CTF中有些web题的信息大概可以通过这种方式加到响应头里去吧(笑)

    我们再次访问resp操作看看我们的响应头

    官方给出可以进行操作的样式有这些。

    页面跳转功能,在客户端输入正确的参数的时候我们给予相应正确的跳转,反之我们给予错误的跳转。

    如果var是sijidou就跳转之前写的req()方法中,否则跳到写的resp()方法中

    这里有个注意 use raitscontrollerJump应放在类里面,如果放在类外面,他会报错

    然后就是重定向了,这个重定向可以支持用use raitscontrollerJump来调用,也可以使用助手函数redirect()来完成,这里我们演示下使用use raitscontrollerJump来调用,重定向到百度是可以实现的。

    这里我输百度的url的时候,最先没加http://头,报错说找不到www.baidu.com模块,显然,它是走的自身模块去匹配,那么要跳转到不是我这个系统的网站,那么要加上http://之类的请求头。

  • 相关阅读:
    CentOS下Docker与.netcore(五)之 三剑客之一Docker-swarm集群
    Dockerfile 解析--文件结构
    秒懂JWT
    智能爬虫框架
    Docker 学习笔记-数据管理
    枚举器与迭代器
    Entity Framework 并发冲突解决方案
    Entity Framework Core 简介
    Try 和异常
    Nginx反向代理实现docker容器域名解析
  • 原文地址:https://www.cnblogs.com/sijidou/p/9164342.html
Copyright © 2011-2022 走看看