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'));
});
我是温新
每天进步一点点,就一点点