Laravel表单验证&文件上传

一、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()){
    //
}

猜你喜欢

转载自blog.csdn.net/csdn_heshangzhou/article/details/83034953