一、token验证
服务器端执行route/web.php
路由的请求,只要请求方式为post/put/patch
,都会自动执行csrf的token验证
1、模板中设置token验证:
方式1:<input type="hidden" name="_token" value="{{csrf_token()}}">
方式2:{{csrf_field()}}
方式3:@csrf
2、跳过csrf验证
如果有哪个路由请求不需要经过csrf校验,就把该请求地址设置给VerifyCsrfToken 中间件
app/Http/Middleware/VerifyCsrfToken.php
中。
设置如下:
class VerifyCsrfToken extends BaseVerifier
{
/**
*从CSRF验证中排除的URL
* @var array
*/
protected $except = [
'manager/add',
];
}
二、表单验证
1、基本语法
①方法一:使用控制器的validate方法自动验证
public function store(Request $request){
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// 验证通过,存储到数据库...
}
validate方法接收一个HTTP请求输入数据和验证规则,如果验证规则通过,代码将会继续往下执行;如果验证失败,Laravel将会自动将用户重定向回上一个位置,所有验证错误信息会自动一次性存放到session。
②方法二:手动创建验证器
use Validator;
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
if ($validator->fails()) {
return redirect('post/create')
->withErrors($validator) //将错误数据一次性存放到session
->withInput(); //将请求参数一次性存放到session,用于页面展示
}
// 验证通过,存储到数据库...
}
make方法的第一个参数是需要验证的数据,第二个参数是要应用到数据上的验证规则。
验证失败时,可以使用withErrors方法将错误数据一次性存放到session,withErrors方法接收一个验证器、或者一个PHP数组。
注:如果手动创建一个验证器实例,但仍然想使用ValidatesRequest trait提供的自动重定向,可以调用已存在验证器上的validate方法,如果验证失败,用户将会被自动重定向,或者,如果是AJAX请求的话,返回JSON响应:
Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
])->validate();
2、模板中输出错误信息&表单显示之前输入的值
①将错误信息一次性存放到session后,视图页面可以使用$errors
对象来获取的;
{{--低版本提供错误的解决的方法--}}
@if (count($errors) > 0)
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
{{--高版本提供错误的解决的方法--}}
@if($errors->any())
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
②表单中可以调用old函数显示之前输入的值
<input type="text" name="username" value="{{old('username')}}">
3、验证规则
required
:不能为空
email
:验证邮箱是否合法
confirmed
:验证两个字段是否相同,如果验证的字段是password,则必须输入一个与之匹配的password_confirmation字段, 即密码的name属性值为xxx,则确认密码name属性值必须为xxx_confirmation。
integer
:验证字段必须是整型
ip
:验证字段必须是IP地址
numeric
:验证字段必须是数值
size:value
:验证字段必须有和给定值value想匹配的尺寸,对字符串而言,value是相应的字符数目,对数值而言,value是给定整型值;对文件而言,value是相应的文件字节数。
max:value
:验证字段必须小于等于最大值,和size规则使用方式一致。
min:value
:验证字段必须大于等于最小值,和size规则使用方式一致。
between:min, max
:验证字段在给定的范围之间
string
:验证字段必须是字符串
unique
:表名,[字段,需要排除的ID, 主键字段名]
如果数据表主键字段名称不是id
,可以通过第4个参数进行设置
'user_name' => 'required|unique:user,username,'.$user->id.',user_id';
regex:pattern
:验证字段必须匹配给定的正则表达式
#### 4、自定义错误信息
// 定义验证规则
$rules = [
'username' => 'required|regex:/^\w+$/',
'password' => 'required|min:5|max:16',
'code' => 'required|size:4|captcha'
];
// 自定义错误信息
$message = [
'username.required' => '用户名不能为空',
'password.required' => '密码不能为空',
'code.required' => '验证码不能为空',
'code.size' => '验证码必须是4位',
];
// 1、自动验证方式
// $this->validate($request, $rules, $message);
// 2、手动创建验证器
$validator = Validator::make($request->all(), $rules, $message);
// 如果验证失败:withErrors方法记录错误信息,withInput方法记录输入参数
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
三、文件上传功能
1、基本原理
将上传的文件保存到服务器指定位置,将服务器上文件的访问路径保存到数据表。
文件上传大小限制:
-> post请求最大限制
-> 文件上传最大限制
2、框架中的文件上传
-> 基本配置
①文件系统配置:(文件保存路径)
修改config/filesystems.php
如下
文件实际存储路径为:
/storage/app/public/
目录下②创建符号链接
由于域名指向的是public目录,为了能通过网络访问,需要创建
public/storage
到storage/app/public
的符号链接。项目根目录下 执行以下命令:
php artisan storage:link
-> 基本语法
表单代码示例:
<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="head_img" /> <br>
<input type="submit" value="上传" />
</form>
控制器代码示例:
public function upload(Request $request){
//获取表单上传文件
$file = $request->file('head_img');
//移动文件到文件系统根目录下,日期子目录下
//成功上传则返回相对文件系统根目录的文件路径
$info = $file->store(date('Y-m-d')); //store方法接受一个目录
if ($info) {
// $info:2018-10-09/26dc6cc439f7fbb66601d17d213b094f.jpg
// 网站根目录为public,通过网络访问的图片路径为public/storage/子目录/文件名
// 则存入数据库的图片路径应为/storage/$info
$manager['img_path'] = '/storage/'.$info;
}
相关方法:
使用 file 方法获取上传的文件:
$file = $request->file('image');
使用 hasFile 方法判断文件在请求中是否存在:
if ($request->hasFile('image')) {
//
}
使用 isValid 方法判断文件在上传过程中是否出错:
if ($request->file('image')->isValid()){
//
}
网友评论