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

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

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

原文地址:https://www.cnblogs.com/ddcoder/p/13359342.html