Laravel学习笔记基础系列--(十)Laravel请求的处理
作者:温新
时间:2021-06-26
请求有什么作用?通过前面视图的介绍,已经制作了一个简单的form
表单,那么form
所提交的表单数据怎么处理?这就需要Laravel请求实例Reuqest来处理了。
用一句话来概括,请求实例就是用来处理用户数据。
优雅的请求实例
说明:为了演示,请删除上篇文章演示的中间件功能,并恢复路由为Route::get('demo', 'DemoController@index');
来回顾一下store
方法,可以看到,stroe
方法一个参数$requst
,这个参数是实例参数,其类为Illuminate\Http\Request
。
// DemoController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DemoController extends Controller
{
public function store(Request $request)
{
dd($request->all());
}
}
获取表单数据
获取用户提交表单数据的值,可以使用Illuminate/Http/Request
实例,其封装了很多实用的方法。
获取表单所有数据
all
方法以数组方式获取所有输入的值。现在可以尝试提交表单数据了,然后使用all
方法接收所提交数据的值。
$data = $request->all();
获取一个值
input
方法获取提交表单数据中的一个值。
// 方式一
$username = $request->input('username');
// 方式二 可以指定默认值
$username = $request->input('username','自如初');
query
方法用于获取get参数
用法与input
类似,只不过query
方法用获取get
请求参数。
第一步:定义路由 web.php
Route::get('test','DemoController@test');
第二步:定义方法 DemoController.php
public function test(Request $request)
{
// 获取单个参数
dump($request->query('name'));
// 指定默认值
dump($request->query('name','自如初'));
// 获取所有get参数
dd($request->query());
}
第三步:访问
你的域名/test??name=lisi&age=17
获取post请求的所有值
如果是post请求,那么all
方法可以换成post
方法。
dump($request->post('username'));
dd($request->post());
query与input的区别
打印$request
实例,会发现它有request
与query
属性:
input
方法会从query
+request
属性中获取请求参数的值;post
方法是从request
属性对象中获取post请求参数值。
简单地说,input
获取所有请求参数;query
获取get请求参数。
通过动态属性获取值
dd($request->username);
获取部分值
使用only
与except
获取部分值。only
获取指定要接收的字段值;except
排除不需要接收的字段值。
改造index.blade.php
界面
<form action="{{ route('store') }}" method="post">
用户名:<input type="text" name="username">
昵称:<input type="text" name="nickname">
邮箱:<input type="text" name="email">
<input type="submit" value="提交">
</form>
获取指定的值
// DemoController.php中的store方法
// 只接收这两个值
dump($request->only(['username','email']));
// 不接收username,其他的都接收
dump($request->except('username'));
获取JSON值
如需要发送JSON数据到后台,需要设置请求头Content-Type
为application/json
,然后可以通过input
方法获取JSON数据。但是必须用.
号解析数组。
$username = $request->input('user.username');
判断请求参数的其他实用方法
判断请求参数是否存在
has
方法用于判断请求参数是否存在,存在返回 true
// stroe方法中演示
// 接收单个值
dump($request->has('username'));
/*
*接收多个,只有都存在时返回true
*age不存在,因此返回了false
*/
dump($request->has(['username','nickname','age']));
hasAny
方法,只要有一个字段值存在就返回true
// age字段不存在,其他两个存在,因此返回true
dump($request->hasAny(['username','nickname','age']));
filled
方法,请求参数必须存在且不能为空。
// 提交表单时,username不填写,返回FALSE,有值返回true
dump($request->filled('username'));
missing
方法,判断请求参数字段不存在
// age字段值不存在,返回true
dump($request->missing('age'));
获取请求路径与方法
假如要获取当前请求的URL路径该怎么办?$request
实例中提供了相关的方法。
下面我们基于DemoController
中的index
方法来演示。
获取请求路径
path
方法获取当前请求的路径信息,如http://demo.com/usr/1
,则path
方法返回/usr/1
。
// DemoController.php
public function index(Request $request)
{
// 返回 demo
dump($request->path());
return view('demo.index');
}
获取请求的URL
获取完整的URL信息可以使用url
方法或fullurl
方法。url
返回不带参数的url,fullurl
返回包含参数的URL。
// 如请求:http://la8.com/demo?id=112
// url()方法返回http://la8.com/demo
dump($request->url());
// fullurl()方法返回 http://la8.com/demo?id=112
dump($request->fullurl());
获取请求方法
method
方法返回HTTP请求方式。isMethod
方法验证HTTP请求。
本例演示将在store
方法中进行。
// 获取当前请求方法
$method = $request->method();
// 判断是否为POST请求
if ($request->isMethod('POST')) {
}
请求数据缓存
有这样一个真实开发环境,比如登录页面填写用户名与密码,假如密码输错了,那么整个页面的信息需要填写,这是很不友好的。Laravel提供了这样一个机制,两次请求之间,可以获取上一次请求的值。若使用的是Laravel自带的验证机制,那么需要设置,可以直接在在视图中使用old()
助手函数调用。如下案例
<!--index.blade.php-->
<form action="{{ route('store') }}" method="post">
用户名:<input type="text" name="username" value="{{old('username')}}">
<input type="submit" value="提交">
</form>
将数据存入session
$request->flash();
获取上一次请求数据
$request->old('username');
Cookie操作
由于Cookie
是存储在浏览器端的,因此cookie
必须依赖于某个请求和响应
,session
是存储在服务器端,因此session不需要依赖某个请求或响应头。
关于cookie
的操作,直接在路由中进行演示。
定义路由:
Route::get('addcookie', function(){
return response('自如初博客')->cookie('webName','自如初',60);
});
Route::get('getcookie', function(\Illuminate\Http\Request $request){
dump($request->cookie('webName'));
});
添加cookie到响应
用法:cooke(cookie键,cookie值,cookie有效时间);
Route::get('addcookie', function(){
return response('自如初博客')->cookie('webName','自如初',60);
});
获取cookie
Route::get('getcookie', function(\Illuminate\Http\Request $request){
dump($request->cookie('webName'));
});
我是温新
每天进步一点点,就一点点