美文网首页
Laravel表单验证&文件上传

Laravel表单验证&文件上传

作者: 老衲灬 | 来源:发表于2018-10-13 00:54 被阅读252次

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

    相关文章

      网友评论

          本文标题:Laravel表单验证&文件上传

          本文链接:https://www.haomeiwen.com/subject/tlmnaftx.html