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是所在目录
            }
         }
    }

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

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

  • 相关阅读:
    MySQL源代码解读(二)
    MySQL源代码解读(一)
    C语言中如何对串口进行操作
    mysql 运行概图
    Yacc 与 Lex
    外键建索引
    提高SQL查询效率
    MySQL源代码分析:(1)Main函数
    Linux "could not open default font 'fixed'."
    转帖 浅析ARM汇编语言子例程设计方法
  • 原文地址:https://www.cnblogs.com/ddcoder/p/13359342.html
Copyright © 2011-2022 走看看