Laravel - 请求 - Request
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
Laravel 中一般通过控制器方法依赖注入来获取当前请求的Request实例。
通常能在控制器中看到这样的代码, 当请求store方法的时候,传入了一个超基本的 Request实例。
可以来看一下,通常 Request 实例 会有什么快捷函数给我们使用。
[ 代码实例 ]
//修改RiderController
//不要忘记在routes/web.php 中添加路由
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class RiderController extends Controller
{
...
//测试请求
public function getUrl(Request $request) {
$path = $request->path();
$url = $request->url();
$fullUrl = $request->fullUrl();
$fullUrlQuery = $request->fullUrlWithQuery(array('time'=>time()));
$method = $request->getMethod();
$is_get_url = $request->is('rider/getUrl');
echo "<pre>";
echo "Path: ".$path."<br/>";
echo "Url: ".$url."<br/>";
echo "FullUrl: ".$fullUrl."<br/>";
echo "FullUrl With Query: ".$fullUrlQuery."<br/>";
echo "Method: ".$method."<br/>";
echo "Is match:".$is_get_url."<br/>";
echo "</pre>";
}
...
}
接下来访问以下Url :
http://localhost/sample/public/rider/getUrl?id=1&str=&ab=1.0.1
然后可以看到浏览器上面的结果
Path: rider/getUrl
Url: http://localhost/sample/public/rider/getUrl
FullUrl: http://localhost/sample/public/rider/getUrl?ab=1.0.1&id=1&str=
FullUrl With Query: http://localhost/sample/public/rider/getUrl?id=1&ab=1.0.1&time=1496482416
Method: GET
Is match:1
[ 获取请求路径 ]
使用 $request->path();
的时候就可以获得当前路由,返回了
Path: rider/getUrl
使用 $request->is('正则表达式');
的时候就可以和 path() 进行字符串对比匹配
[ 获取请求的 URL ]
使用 $request->url();
的时候就可以获得当前url地址
Url: http://localhost/sample/public/rider/getUrl
使用 $request->fullurl();
的时候就可以获得当前url地址, 且包括了查询字符串
FullUrl: http://localhost/sample/public/rider/getUrl?ab=1.0.1&id=1&str=
使用 $request->fullUrlWithQuery(['key'=>'value']);
的时候就可以获得当前url地址, 且包括了查询字符串,还能加入自己想要的查询拼接。
FullUrl With Query: http://localhost/sample/public/rider/getUrl?id=1&ab=1.0.1&time=1496482416
[ 获取请求方法 ]
使用 $request->getMethod();
就返回了请求的方式
Method: GET
还可以使用 $request->isMethod(); 来匹配判断请求方式
[ 获取所有输入数据 ]
使用 $request->all();
来获取全部提交的数据,不论GET/ POST.
[ 获取指定输入数据 ]
使用 $request->only();
或者 $request->except();
来获取部分提交的数据,不论GET/ POST.
//假设提交了,id,name,age
//这样 $one 里面就只有 id 和 name;
$one = $request->only(['id','name']);
//这样 $two 里面只有 name;
$two = $request->except(['id','age']);
[ 检测参数是否提交 ]
使用$request->has('key');
来判断是否有这个键值的变量提交
[ 旧数据处理 ]
使用$request->flash();
会将输入数据闪存至 Session
使用 $request->flashOnly();
或者 $request->flashExcept(); 可以对需要闪存的数据进行筛选。
使用 $request->old();
可以获得上一次请求的闪存数据,当然前提是上一次请求有进行 $request->flash();
//如果填写 key 就返回对应 value, 什么都不填,就是全部闪存数据。
$username = $request->old('username');
[ Cookies处理 ]
Laravel 框架创建的每个 cookie 都会被加密并且加上认证标识,这代表着用户擅自更改的 cookie 都会失效。
使用$request->cookies('key');
来获取
$value = $request->cookie('name');
[ 将 Cookies 附加到响应 ]
你可以使用 cookie
方法附加一个 cookie 到 Illuminate\Http\Response
实例。
有效 cookie 应该传递字段名称,字段值和过期时间给这个方法:
return response('Hello World')->cookie(
'name', 'value', $minutes
);
[ 文件接收 ]
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class RiderController extends Controller
{
...
public function uploadBelt(Request $request){
$save_path = "";
if($request->isMethod('get')) {
return view('rider.uploadBelt');
} else {
$path = public_path().'/uploads/img';
if ($request->hasFile('picture')) {
$img = $request->file('picture');
$extension = $img->extension();
$ext_ary = ['png','jpg','gif'];
if(in_array($extension , $ext_ary)) {
$name = time()."_Belt.".$extension;
$img->move($path,$name);
$save_path = url('/').'/uploads/img/'.$name;
$error = "OK";
} else {
$error = "Error - Extension";
}
} else {
$error = "Error - File Not Found";
}
return view('rider.uploadBelt')->with([
'img' => $save_path,
'error' => $error,
]);
}
}
...
}
?>
UploadBelt.blade.php
<div>
<form method="post" enctype="multipart/form-data" >
{!! csrf_field() !!}
<input type="file" name="picture">
<button type="submit"> 提交 </button>
</form>
</div>
@if(isset($img) && !empty($img))
<div>
<img src="{{ $img }}">
</div>
@endif
@if(!empty($error))
<script>
alert("{{ $error }}");
</script>
@endif
当要上传文件的时候,使用 $request->file('picture'); 来获取上传的文件
需要获取文件后缀名,使用 $request->picture->extension(); 来获取文件后缀。
文件的保存有两个方法,分别是使用 move()
或者 store()/storeAs()
//store 会自动替换文件名
$path = $request->photo->store('images');
//store 则可以提交自定义文件名
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
store()/storeAs()方法,还涉及到了Laravel的文件存储系统,后面再详细讲解。
如果使用 move()
方法,就可以直接把上传的文件保存到指定的位置了。