zoukankan      html  css  js  c++  java
  • Laravel入坑指南(5)——请求与响应

    作为互联网典型的Web应用,接收用户请求的数据,并将处理的结果向用户进行响应,是最基础也是最必备的功能。在原生的PHP中,我们常用$_POST、$_GET、$_REQUEST和$_FILES对不同的请求接收,也用echo、var_export()、printf()等语句向用户进行响应。

    在Laravel中,框架内部规定了自己的一套机制请求与响应机制。在这一节中,就让我们一起学习这个话题。

    1、请求

    (1) 路由参数

     Laravel的参数,可以通过路由指定,并在路由的回调函数或指定的Controller中进行处理。举两个栗子:

    示例1:

    IlluminateSupportFacadesRoute::any('/welcome/{id}',function ($id){
        return $id;
    });

    在这个例子中,用户访问http://域名/welcome/6,回调函数中的$id参数就可以接收到6这个值。这里的id参数在url是必填项。

    示例2:

    //路由部分
    IlluminateSupportFacadesRoute::any('/welcome/{id?}',"MyController@hello");
    
    
    //MyController部分
    namespace AppHttpControllers;
    
    use IlluminateHttpRequest;
    
    class MyController extends Controller
    {
        public function hello(Request $req,$id='')
        {
            return $id;
        }
    }

    在这个例子中,用户访问http://域名/welcome/6,类MyController的hello函数中的$id参数就可以接收到6这个值。这里的id参数在url是可选项。(注意与示例1进行对比,路由与函数参数的写法均有区别)

    (2) URL中GET参数的获取

    无论是路由的回调函数,还是controller的行为函数,第一个参数可以用于Request类实例的注入(说白了,函数第一个参数是Request类型的变量)。

    如果还有哪位小伙子不清楚什么是GET请求或GET参数,请点击文章最下方的链接联系我:)

    在处理函数中,我们这样取到GET参数:

    public function action(Request $req)
    {
        $req->query(key);    //传入key值就能获取对应的value
    }

    (3) POST参数的获取

    public function hello(Request $req)
    {
        $req->post(key);
    }

    (4) POST与GET参数混合获取(all函数可以同时获取GET和POST的参数,返回数组类型)

    public function hello(Request $req)
    {
        $arr=$req->all(key);
        $arr[key];    //这就是我们要获取的value
    }

    (5) COOKIE参数获取

    public function hello(Request $req)
    {
        $req->cookie(key);    //这是key对应的cookie值
    }

    (6) 其它

    //请求路径
    //假设访问的路径是http://192.168.1.5/hello/3?a=b
    $req->url();    //获取的是http://192.168.1.5/hello/3
    $req->fullUrl();    //获取的是http://192.168.1.5/hello/3?a=b
    $req->path();    //获取的是hello/3

    2、响应

    (1)响应普通字符串

    在行为函数是直接return字符串即可,请看下面这个栗子:

    public function action(Request $req)
    {
        return "welcome";
    }

    (2)响应JSON

    方法一:在行为处理函数中直接返回数组

    public function action(Request $req)
    {
        return [key=>value];    //Laravel会先把这个数组转为json格式字符串,再传到客户端
    }

    方法二:调用response()->json()

    public function action(Request $req)
    {
        return response()->json([
            key=>value
        ]);
    }

    (3)响应模板

     举个简单的栗子:

    public function action(Request $req)
    {
        return view("welcome");
    }

    详细的请查看本系统第三篇《Laravel入坑指南(3)——模板》

    (4)响应COOKIE 

    /*
    $name : cookie的key
    $value : cookie的值
    $minutes : cookie存活时间
    $path : cookie所属路径,一般填"/"
    $domain : 所属域名,可用于二级域名跨域
    $secure : 设为true则只有在https下才可以使用
    $httpOnly : 设为true则js无法获取cookie值
    */
    return response(响应内容)->cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly);

    (5)响应头:下面这个例子为跨域头

    public function hello(Request $req,$id='')
    {
        return response("welcome",200)->withHeaders([
            'Access-Control-Allow-Origin'=>"*",
            'Access-Control-Allow-Headers'=>'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN',
            'Access-Control-Expose-Headers'=>'Authorization, authenticated',
            'Access-Control-Allow-Methods'=>'GET, POST, PATCH, PUT, OPTIONS',
            'Access-Control-Allow-Credentials'=>'true'
        ]);
    }

    3、文件上传

    (1)单文件上传:假设表单文件的key是f

    public function hello(Request $req)
    {
        if($req->hasFile('f') && $req->file('f')->isValid())
        {
            $file['ext']=$req->f->extension();    //文件扩展名
            $file['path']=$req->f->path();    //文件的路径
            $file['mine']=$req->f->getMimeType();    //文件mime
            $file['originName']=$req->f->getClientOriginalName();    //原始文件名
            $file['size']=$req->f->getClientSize();    //文件尺寸
    
            /*
            $file的值
            array (
                'ext' => 'jpeg',
                'path' => '/tmp/phpxq5lSe',
                'mine' => 'image/jpeg',
                'originName' => '1.jpg',
                'size' => 196118,
            )
            */
            $file['uploadName']=sha1($file['originName']).'.'.$file['ext'];    //要保存的文件名
            $req->f->move(base_path().'/', $file['uploadName']);    //参数1是所在目录
        }
        else
        {
            $req->f->getErrorMessage();    //错误信息
        }
    }

    (2)多文件上传:假设表单文件的key是f[]

    public function hello(Request $req,$id='')
    {
        if($req->hasFile('f'))
        {
            foreach ($req->f as $f)
            {
                if(!$f->isValid()) continue;
    
                $file['ext']=$f->extension();    //文件扩展名
                $file['path']=$f->path();    //文件的路径
                $file['mine']=$f->getMimeType();    //文件mime
                $file['originName']=$f->getClientOriginalName();    //原始文件名
                $file['size']=$f->getClientSize();    //文件尺寸
                $file['uploadName']=sha1($file['originName']).'.'.$file['ext'];  
                $f->move(base_path().'/', $file['uploadName']);    //参数1是所在目录
            }
         }
    }

    ---------------------------  我是可爱的分割线  ----------------------------

    最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

  • 相关阅读:
    Balanced Binary Tree
    Swap Nodes in Pairs
    Reverse Nodes in k-Group
    Reverse Linked List II
    Remove Nth Node From End of List
    Remove Duplicates from Sorted List II
    Remove Duplicates from Sorted List
    Partition List
    Merge Two Sorted Lists
    【Yii2.0】1.2 Apache检查配置文件语法
  • 原文地址:https://www.cnblogs.com/ddcoder/p/13359342.html
Copyright © 2011-2022 走看看