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() 方法,就可以直接把上传的文件保存到指定的位置了。

results matching ""

    No results matching ""