在使用laravel开发restful api的时候,我们知道,不同的操作用不同的请求方法,这就需要知道get、post、put、patch、delete等方法获取数据的方式是怎样的
在Controller中
public function index(Request $request)
{
    $size = $request->size;
}获取全部form表单信息:
$request->input()获取某一个:
$request->input('username')我们知道,put和patch都是在update操作的时候使用,不同的是,put需要提交全部信息,而patch只需要提交需要修改的信息即可。原以为跟post获取方式是一样的,后来发现自己太天真了,为什么会不一样呢?
Illuminate\Http\Request中createFromGlobals方法是这样定义的:
public static function createFromGlobals()
{
        $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
        if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
                && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
        ) {
                parse_str($request->getContent(), $data);
                $request->request = new ParameterBag($data);
        }
        return $request;
}这里面的if语句定义如果Content-Type 不是 application/x-www-form-urlencode ,请求方法为PUT, DELETE, PATCH时,就无法解析。post方法可以正常使用是因为php本身就支持$_POST变量,而PUT, DELETE, PATCH 走的是 php://input
我们针对上面的原因分析,我们提供两种方法
第一种,直接获取输入流:
$request->getContent()这种一般不推荐用,因为输入流数据比较乱,拿到后还要复杂的处理。
第二种是发送请求时,定义Content-Type 为 application/x-www-form-urlencode ,然后我们可以用post的方式获取了。
$request->input()问题就在这里,如果你的 Content-Type 不是 application/x-www-form-urlencode ,且请求方法又是 PUT、DELET 或 PATCH,就会无法解析(POST 正常是因为 PHP 原生支持解析为 $_POST 变量,而 PUT 只能走 php://input 输入流获取),如果这里不是这个 Content-Type 就会悲剧。
解决办法有三个,一个是继承 Request 对象或通过其他扩展手段重写或补充这部分(这个是最佳实践),还有就是通过 $request->getContent 获取原始内容解析(这个问题较多,新手不建议),最后就是改提交内容类型。
先看一个例子
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});在这个例子中,我们在URL中定义{post}, {comment}两个路径参数,而我们在匿名函数中则按照顺序定义两个参数变量$postId,$commentId,然后我们就直接可以用这两个变量获取参数值了。
当然了,更多情况下我们还是在Controller中写逻辑
路由定义
Route::get('posts/{post}/comments/{comment}','HomeController@index');HomeController 中获取
public function index($postId, $commentId)
{
  dump($postId);
    dump($commentId);
}