Laravel入坑指南(5)——请求与响应
作为互联网典型的Web应用,接收用户请求的数据,并将处理的结果向用户进行响应,是最基础也是最必备的功能。在原生的PHP中,我们常用$_POST、$_GET、$_REQUEST和$_FILES对不同的请求接收,也用echo、var_export()、printf()等语句向用户进行响应。
在Laravel中,框架内部规定了自己的一套机制请求与响应机制。在这一节中,就让我们一起学习这个话题。
1、请求
(1) 路由参数
Laravel的参数,可以通过路由指定,并在路由的回调函数或指定的Controller中进行处理。举两个栗子:
示例1:
\Illuminate\Support\Facades\Route::any('/welcome/{id}',function ($id){ return $id; });
在这个例子中,用户访问http://域名/welcome/6,回调函数中的$id参数就可以接收到6这个值。这里的id参数在url是必填项。
示例2:
//路由部分 \Illuminate\Support\Facades\Route::any('/welcome/{id?}',"MyController@hello"); //MyController部分 namespace App\Http\Controllers; use Illuminate\Http\Request; 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是所在目录 } } }
--------------------------- 我是可爱的分割线 ----------------------------
最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。