精华内容
下载资源
问答
  • Laravel 表单验证规则之 Unique(Database)

    千次阅读 2019-02-21 11:15:03
    Laravel表单可用验证规则中有个个人认为不是很好理解的规则,就是下面这个规则

    Laravel 的表单可用验证规则中有个个人认为不是很好理解的规则,就是下面这个规则?:

    unique:table,column,except,idColumn
    

    对于这个规格的使用,Laravel5.1文档Laravel5.5 文档文档更好理解些,

    这个规则其实就是强迫 Unique 规则忽略指定 ID

    有时候,你希望在验证字段时对指定 ID 进行忽略。例如,在「更新个人资料」页面会包含用户名、邮箱等字段。这时你会想要验证更新的 e-mail 值是否为唯一的。如果用户仅更改了名称字段而不是 e-mail 字段,就不需要抛出验证错误,因为此用户已经是这个 e-mail 的拥有者了。假设用户提供的 e-mail 已经被其他用户使用,则需要抛出验证错误。若要用指定规则来忽略用户 ID,则应该把要发送的 ID 当作第三个参数:

    'email' => 'unique:users,email_address,'.$user->id
    

    如果你的数据表使用的主键名称不是 id,那么你可以在第四个参数中来指定它:

    'email' => 'unique:users,email_address,'.$user->id.',user_id'
    

    增加额外的 Where 语句
    你也可以指定更多的条件到「where」查询语句:

    'email' => 'unique:users,email_address,NULL,id,account_id,1'
    

    上述规则中,只有 account_id1 的数据列会被包含在 unique 规则的验证。

    展开全文
  • laravel表单验证验证规则

    千次阅读 2019-06-26 11:18:09
    laravel表单验证规则,验证用户信息是否正确 LNMP环境 php5.6 mysql5.4 代码中有需要注意的位置,都是用“重点”关键字进行标记,可以检索“重点”关键字进行查看。 路由 Route::get('/admin/regulate','admin\...

    laravel表单验证规则,验证用户信息是否正确

    • LNMP环境
    • php5.6
    • mysql5.4

    代码中有需要注意的位置,都是用“重点”关键字进行标记,可以检索“重点”关键字进行查看。

    路由
    Route::get('/admin/regulate','admin\RegulateController@regulate');
        //管理员页面
        Route::get('/admin/regulateadd','admin\RegulateController@regulateAdd');
        //添加管理员
        Route::post('/admin/regulatecreate','admin\RegulateController@regulateCreate');
        //编辑管理员
        Route::match(['get','post'],'/admin/regulateedit/{id}','admin\RegulateController@regulateEdit');
        //停用管理员
    
    控制器
    • 此控制器包含,新增,修改,停用管理员的操作,以及验证规则。
    • 验证规则用到了,正则,用户唯一判断,不能为空等。
    <?php namespace App\Http\Controllers\admin;
    
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    use Illuminate\Support\Facades\DB;
    
    use Illuminate\Http\Request;
    
    class RegulateController extends Controller {
    
    	/**
    	 * @Author <winner443@163.com>
    	 *
    	 * @return Response
    	 */
    	public function regulate()
    	{
    		/*
    		 * @Author <winner>
    		 * function 管理员控制器
    		 * */
    		//读取管理员数据
            $data = \DB::select("select a.*,(select s.group_name from sys_group as s where s.id = a.auth_id) as group_name from admins as a");
    		return view('admin.regulate')->with('data',$data);
    	}
    	//添加管理员页面
    	public function regulateAdd(){
    	    $group_name = \DB::table('sys_group')->get();
    	    return view('admin.adminAdd')->with(['group_name'=>$group_name]);
        }
        //添加管理员操作
        public function regulateCreate(Request $request){
    	    //接收全部数据
    	    $values = $request->all();
    	    //设置验证规则
            $rule = [
              'login_name'=>'required|unique:admins,login_name|regex:/^[a-zA-Z][a-zA-Z0-9_]{3,10}$/',
              //'login_name'=>array('regex:/^[a-zA-Z][a-zA-Z0-9_]{4,10}$/'),//TODO <winner remarks>正则如果要是这样写,那么required就不能验证了。
              'pwd'=>'required|min:6|max:18|same:repwd',
              'tel'=>'required|regex:/^1[34578]\d{9}$/',
              'email'=>'required|email',
              'auth_id'=>'required'
            ];
            //设置提示信息
            $message = [
              'login_name.required'=>'用户名不能为空',
              'login_name.unique'=>'用户名已存在,请重新输入',
              'login_name.regex'=>'用户名格式必须为字母、数字、下划线,3-10位组成。',
              'pwd.max'=>'请输入6-18位密码',
              'pwd.min'=>'请输入6-18位密码',
              'pwd.required'=>'密码不能为空',
              'pwd.same'=>'两次密码不一致',
              'tel.required'=>'手机号不能为空',
              'tel.regex'=>'手机号格式不正确',
              'email.required'=>'邮箱不能为空',
              'email'=>'邮箱格式不正确',
              'auth_id.required'=>'角色不能为空'
            ];
            $validator = \Validator::make($values,$rule,$message);
            if ($validator->passes()){
                //插入数据
                //过滤掉多余的字段
                unset($_POST['repwd']);
                //$_POST['pwd'] = base64_encode(md5($_POST['pwd']));
                $_POST['pwd'] = md5(SALT.$_POST['pwd']);
                $_POST['token'] = str_random(50);
                $_POST['create_time'] = time();
                $_POST['update_time'] = null;
                $result = \DB::table('admins')->insert($_POST);
                if ($result){
                    $data = [
                      'status'=>'200',
                      'href'=>'http://mfwx.bjmfzyz.com/admin/regulate',
                      'info'=> '添加成功'
                    ];
                    return json_encode($data);
                }else{
                    $data = [
                      'status'=>'202',
                      'info'=>'添加失败,稍后重试'
                    ];
                    return json_encode($data);
                }
            }else{
                return response()->json([
                    'status'=>'201',
                    'info'=>$validator->errors()->first()
                ]);
            }
        }
        //编辑管理员
        public function regulateEdit($id,Request $request){
            if ($request->isMethod('GET')){
                //角色列表
                $group_name = \DB::table('sys_group')->get();
                //查询管理员,嵌套查询看此管理员属于哪一个角色的。
                $data = \DB::select("select a.*,(select s.group_name from sys_group as s where s.id = a.auth_id) as group_name from admins as a where a.id = $id");
                return view('admin.adminEdit')->with(['data'=>$data,'group_name'=>$group_name]);
            }else{
                //接收全部数据
                $values = $request->all();
                //设置验证规则
                $rule = [
                    'login_name'=>'required|regex:/^[a-zA-Z][a-zA-Z0-9_]{3,10}$/|unique:admins,login_name,'.$id,//忽略指定此id的验证
                    'tel'=>'required|regex:/^1[34578]\d{9}$/',
                    'email'=>'required|email',
                ];
                $message = [
                    'login_name.required'=>'用户名不能为空',
                    'login_name.unique'=>'用户名已存在,请重新输入',
                    'login_name.regex'=>'用户名格式必须为字母、数字、下划线,3-10位组成。',
                    'tel.required'=>'手机号不能为空',
                    'tel.regex'=>'手机号格式不正确',
                    'email.required'=>'邮箱不能为空',
                    'email'=>'邮箱格式不正确'
                ];
                $validator = \Validator::make($values,$rule,$message);
                if ($validator->passes()){
                    $_POST['update_time'] = time();
                    $result = \DB::table('admins')->where('id','=',$id)->update($_POST);
                    if ($result){
                        $data = [
                            'status'=>'200',
                            'info'=>'修改成功'
                        ];
                        return json_encode($data);
                    }else{
                        $data = [
                            'status'=>'202',
                            'info'=>'修改失败'
                        ];
                        return json_encode($data);
                    }
                }else{
                    return response()->json([
                       'status'=>'201',
                       'info'=>$validator->errors()->first()
                    ]);
                }
            }
        }
        //停用管理员
        public function regulateStop($id,Request $request){
    	    if ($request->input('start')=='1'){
    	        //停用
                $data = [];
                $data['start'] = 1;
                $result = \DB::table('admins')->where('id','=',$id)->update($data);
                if ($result){
                    $data = [
                        'status'=>'200',
                        'info'=>'停用成功'
                    ];
                    return json_encode($data);
                }else{
                    $data = [
                        'status'=>'201',
                        'info'=>'停用失败'
                    ];
                    return json_encode($data);
                }
            }else{
    	        //启用
                $data['start'] = 0;
                $result = \DB::table('admins')->where('id','=',$id)->update($data);
                if ($result){
                    $data = [
                        'status'=>'200',
                        'info'=>'启用成功'
                    ];
                    return json_encode($data);
                }else{
                    $data = [
                        'status'=>'201',
                        'info'=>'启用失败'
                    ];
                    return json_encode($data);
                }
            }
        }
        //修改管理员密码
        public function regulateResetPwd($id,Request $request){
            if ($request->isMethod('GET')){
                $data = \DB::select("select a.*,(select s.group_name from sys_group as s where s.id = a.auth_id) as group_name from admins as a where a.id = $id");
                return view('admin.adminResetPwd')->with(['data'=>$data]);
            }else{
                $values = $request->all();
                $rule = [
                  'pwd'=>'required|min:5|max:18|same:repwd',
                ];
                $message = [
                    'pwd.required'=>'密码不能为空',
                    'pwd.min'=>'请输入6-18位密码',
                    'pwd.max'=>'请输入6-18位密码',
                    'pwd.same'=>'两次密码不一致'
                ];
                $validator = \Validator::make($values,$rule,$message);
                if ($validator->passes()){
                    $data = array();
                    $data['pwd'] = md5(SALT.$request->input('pwd'));
                    $result = DB::table('admins')->where('id','=',$id)->update($data);
                    if ($result){
                        $data = [
                            'status'=>'10000',
                            'info'=>'密码修改成功'
                        ];
                        return $data;
                    }else{
                        $data = [
                            'status'=>'10004',
                            'info'=>'密码修改失败'
                        ];
                        return $data;
                    }
                }else{
                    return response()->json([
                       'status'=>'10001',
                       'info'=>$validator->errors()->first()
                    ]);
                }
            }
        }
     }   
    
    视图

    添加视图

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta charset="utf-8">
    <meta id="farm_csrf" name="csrf-token" content="{{ csrf_token() }}"<重点:new insert>这个是处理laravel的CSRF验证
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
    <meta http-equiv="Cache-Control" content="no-siteapp" />
    <!--[if lt IE 9]>
    <script type="text/javascript" src="admin/lib/html5shiv.js"></script>
    <script type="text/javascript" src="admin/lib/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui/css/H-ui.min.css")}} />
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui.admin/css/H-ui.admin.css")}}/>
    <link rel="stylesheet" type="text/css" href={{asset("admin/lib/Hui-iconfont/1.0.8/iconfont.css")}}/>
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui.admin/skin/default/skin.css")}} id="skin" />
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui.admin/css/style.css")}}/>
    <!--[if IE 6]>
    <script type="text/javascript" src="admin/lib/DD_belatedPNG_0.0.8a-min.js" ></script>
    <script>DD_belatedPNG.fix('*');</script>
    <![endif]-->
    <title>添加管理员 - 管理员管理</title>
    <meta name="keywords" content="">
    <meta name="description" content="">
    </head>
    <body>
    <article class="page-container">
    	<form class="form form-horizontal" id="formAdd">
    	<div class="row cl" style="width:90%;">
    		<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>管理员:</label>
    		<div class="formControls col-xs-8 col-sm-9">
    			<input type="text" class="input-text" value="" placeholder="" id="loginName" name="login_name">
    		</div>
    	</div>
    	<div class="row cl" style="width:90%;">
    		<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>初始密码:</label>
    		<div class="formControls col-xs-8 col-sm-9">
    			<input type="password" class="input-text" autocomplete="off" value="" placeholder="密码" id="pwd" name="pwd">
    		</div>
    	</div>
    	<div class="row cl" style="width:90%;">
    		<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>确认密码:</label>
    		<div class="formControls col-xs-8 col-sm-9">
    			<input type="password" class="input-text" id="rePwd" autocomplete="off"  placeholder="确认新密码" name="repwd">
    		</div>
    	</div>
    	<div class="row cl" style="width:90%;">
    		<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>状态:</label>
    		<div class="formControls col-xs-8 col-sm-9 skin-minimal">
    			<div class="radio-box">
    				<input name="start" type="radio" id="start" value="0" checked>
    				<label for="sex-1">启用</label>
    			</div>
    			<div class="radio-box">
    				<input type="radio" id="start" name="start" value="1">
    				<label for="sex-2">禁用</label>
    			</div>
    		</div>
    	</div>
    	<div class="row cl" style="width:90%;">
    		<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>手机:</label>
    		<div class="formControls col-xs-8 col-sm-9">
    			<input type="text" class="input-text" value="" placeholder="" id="tel" name="tel">
    		</div>
    	</div>
    	<div class="row cl" style="width:90%;">
    		<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>邮箱:</label>
    		<div class="formControls col-xs-8 col-sm-9">
    			<input type="text" class="input-text" placeholder="@" name="email" id="email">
    		</div>
    	</div>
    	<div class="row cl" style="width:90%;">
    		<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>角色:</label>
    		<div class="formControls col-xs-8 col-sm-9">
    			<span class="select-box" style="width:150px;">
    				<select class="select" name="auth_id" id="authID" size="1">
    					<option value="">请选择</option>
    					@foreach($group_name as $v)
    						<option value="{{$v->id}}">{{$v->group_name}}</option>
    					@endforeach
    				</select>
    			</span>
    		</div>
    	</div>
    	{{--<div class="row cl" style="width:90%;">
    		<label class="form-label col-xs-4 col-sm-3">备注:</label>
    		<div class="formControls col-xs-8 col-sm-9">
    			<textarea name="" cols="" rows="" class="textarea"  placeholder="" dragonfly="true" onKeyUp="$.Huitextarealength(this,100)"></textarea>
    			<p class="textarea-numberbar"><em class="textarea-length">0</em>/100</p>
    		</div>
    	</div>--}}
    	<div class="row cl" style="width:90%;">
    		<div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3">
    			{{--<input class="btn btn-primary radius" type="submit" value="&nbsp;&nbsp;提交&nbsp;&nbsp;">--}}
    			<button id="adminsSubmit" class="btn btn-primary radius" type="button"><i class="Hui-iconfont">&#xe632;</i> 保存并提交</button>
    			<input class="btn btn-default radius"  type="reset" value="&nbsp;&nbsp;重&nbsp;置&nbsp;&nbsp;">
    		</div>
    	</div>
    	</form>
    </article>
    
    <!--_footer 作为公共模版分离出去-->
    <script type="text/javascript" src={{asset("admin/static/h-ui.admin/js/H-ui.admin.js")}}></script> <!--/_footer 作为公共模版分离出去-->
    
    <!--请在下方写此页面业务相关的脚本-->
    <script type="text/javascript" src={{asset("admin/lib/jquery.validation/1.14.0/jquery.validate.js")}}></script>
    <script type="text/javascript" src={{asset("admin/js/md5.js")}}></script>
    <script type="text/javascript">
     <重点:new insert>这个是处理laravel的CSRF验证
    $(function(){
    	$.ajaxSetup({
    		headers: {
    			'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    		}
    	});
    	//TODO <winner insert 201906101906> 添加管理员ajax
    	$("#adminsSubmit").click(function(){
    		/* //TODO <winner sign>想着用js的加密了。但是这样密码的位数在后端就不好判断了。所以不加密了。直接传。
    		var loginName = $("#loginName").val();
    		var pwd = hex_md5($("#pwd").val());
    		var rePwd = hex_md5($("#rePwd").val());
    		//选中radio单选框的被选中的val值
    		var start = $('input[name="start"]:checked').val();
    		var tel = $("#tel").val();
    		var email = $("#email").val();
    		var authID = $("#authID").val();*/
    		$.ajax({
    			type:'POST',
    			url:'/admin/regulatecreate',
    			dataType:'json',
    			data:$("#formAdd").serialize(),
    			//data:{'login_name':loginName,'pwd':pwd,'repwd':rePwd,'start':start,'tel':tel,'email':email,'auth_id':authID},
    			success:function(data){
    				if (data.status=='201'){
    					layer.msg(data.info,{icon:5});
    				}else if(data.status=='202'){
    					layer.msg(data.info,{icon:5,time:1500});
    					//window.parent.location.reload();
    				}else{
    					layer.msg(data.info,{icon:1,time:1500});
    					//window.parent.location.reload();
    				}
    			},
    			error:function(){
    				layer.msg('网络错误,稍后重试',{icon:5,time:1500});
    				//window.parent.location.reload();
    			}
    		});
    	});
    	$('.skin-minimal input').iCheck({
    		checkboxClass: 'icheckbox-blue',
    		radioClass: 'iradio-blue',
    		increaseArea: '20%'
    	});
    	
    	$("#form-admin-add").validate({
    		rules:{
    			adminName:{
    				required:true,
    				minlength:4,
    				maxlength:16
    			},
    			password:{
    				required:true,
    			},
    			password2:{
    				required:true,
    				equalTo: "#password"
    			},
    			sex:{
    				required:true,
    			},
    			phone:{
    				required:true,
    				isPhone:true,
    			},
    			email:{
    				required:true,
    				email:true,
    			},
    			adminRole:{
    				required:true,
    			},
    		},
    		onkeyup:false,
    		focusCleanup:true,
    		success:"valid",
    		submitHandler:function(form){
    			$(form).ajaxSubmit({
    				type: 'post',
    				url: "xxxxxxx" ,
    				success: function(data){
    					layer.msg('添加成功!',{icon:1,time:1000});
    				},
                    error: function(XmlHttpRequest, textStatus, errorThrown){
    					layer.msg('error!',{icon:1,time:1000});
    				}
    			});
    			var index = parent.layer.getFrameIndex(window.name);
    			parent.$('.btn-refresh').click();
    			parent.layer.close(index);
    		}
    	});
    });
    </script> 
    <!--/请在上方写此页面业务相关的脚本-->
    </body>
    </html>
    

    修改视图

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta charset="utf-8">
    <meta id="farm_csrf" name="csrf-token" content="{{ csrf_token() }}"><重点:new insert>这个是处理laravel的CSRF验证
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
    <meta http-equiv="Cache-Control" content="no-siteapp" />
    <!--[if lt IE 9]>
    <script type="text/javascript" src="admin/lib/html5shiv.js"></script>
    <script type="text/javascript" src="admin/lib/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui/css/H-ui.min.css")}} />
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui.admin/css/H-ui.admin.css")}}/>
    <link rel="stylesheet" type="text/css" href={{asset("admin/lib/Hui-iconfont/1.0.8/iconfont.css")}}/>
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui.admin/skin/default/skin.css")}} id="skin" />
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui.admin/css/style.css")}}/>
    <!--[if IE 6]>
    <script type="text/javascript" src="admin/lib/DD_belatedPNG_0.0.8a-min.js" ></script>
    <script>DD_belatedPNG.fix('*');</script>
    <![endif]-->
    <title>修改管理员 - 管理员管理</title>
    <meta name="keywords" content="">
    <meta name="description" content="">
    </head>
    <body>
    <article class="page-container">
    	@foreach($data as $data)
    		<form class="form form-horizontal" id="formEdit">
    		<input id="editID" type="hidden" value="{{$data->id}}">
    		<div class="row cl" style="width:90%;">
    			<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>管理员:</label>
    			<div class="formControls col-xs-8 col-sm-9">
    				<input type="text" class="input-text" value="{{$data->login_name}}" placeholder="" id="adminName" name="login_name">
    			</div>
    		</div>
    		<div class="row cl" style="width:90%;">
    			<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>状态:</label>
    			<div class="formControls col-xs-8 col-sm-9 skin-minimal">
    				<div class="radio-box">
    					<input name="start" type="radio" id="sex-1" value="0" @if($data->start==0)checked @endif>
    					<label for="sex-1">启用</label>
    				</div>
    				<div class="radio-box">
    					<input type="radio" id="sex-2" name="start" value="1" @if($data->start==1)checked @endif>
    					<label for="sex-2">禁用</label>
    				</div>
    			</div>
    		</div>
    		<div class="row cl" style="width:90%;">
    			<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>手机:</label>
    			<div class="formControls col-xs-8 col-sm-9">
    				<input type="text" class="input-text" value="{{$data->tel}}" placeholder="" id="phone" name="tel">
    			</div>
    		</div>
    		<div class="row cl" style="width:90%;">
    			<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>邮箱:</label>
    			<div class="formControls col-xs-8 col-sm-9">
    				<input type="text" class="input-text" placeholder="@" name="email" id="email" value="{{$data->email}}">
    			</div>
    		</div>
    		<div class="row cl" style="width:90%;">
    			<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>角色:</label>
    			<div class="formControls col-xs-8 col-sm-9"> <span class="select-box" style="width:150px;">
    			<select class="select" name="auth_id" size="1">
    				<option value="{{$data->auth_id}}">{{$data->group_name}}</option>
    				@foreach($group_name as $v)
    					<option @if($v->id==$data->auth_id)style="display: none;"@endif value="{{$v->id}}">{{$v->group_name}}</option>
    				@endforeach
    			</select>
    			</span>
    			</div>
    		</div>
    		<div class="row cl" style="width:90%;">
    			<div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3">
    				{{--<input class="btn btn-primary radius" type="submit" value="&nbsp;&nbsp;提交&nbsp;&nbsp;">--}}
    				<button id="adminsEdit" class="btn btn-primary radius" type="button"><i class="Hui-iconfont">&#xe632;</i> 保存并提交</button>
    				{{--<input class="btn btn-default radius"  type="reset" value="&nbsp;&nbsp;重&nbsp;置&nbsp;&nbsp;">--}}
    			</div>
    		</div>
    	</form>
    	@endforeach
    </article>
    
    <!--_footer 作为公共模版分离出去-->
    <script type="text/javascript" src={{asset('admin/layui/layui.all.js')}}></script>
    <script type="text/javascript" src={{asset("admin/lib/jquery/1.9.1/jquery.min.js")}}></script>
    <script type="text/javascript" src={{asset("admin/lib/layer/2.4/layer.js")}}></script>
    <script type="text/javascript" src={{asset("admin/static/h-ui/js/H-ui.min.js")}}></script>
    <script type="text/javascript" src={{asset("admin/static/h-ui.admin/js/H-ui.admin.js")}}></script> <!--/_footer 作为公共模版分离出去-->
    
    <!--请在下方写此页面业务相关的脚本-->
    <script type="text/javascript" src={{asset("admin/lib/jquery.validation/1.14.0/jquery.validate.js")}}></script>
    <script type="text/javascript" src={{asset("admin/lib/jquery.validation/1.14.0/validate-methods.js")}}></script>
    <script type="text/javascript" src={{asset("admin/lib/jquery.validation/1.14.0/messages_zh.js")}}></script>
    <script type="text/javascript">
    <重点:new insert>这个是处理laravel的CSRF验证
    $(function(){
    	$.ajaxSetup({
    		headers: {
    			'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    		}
    	});
    	//TODO <winner insert 201906101906> 添加管理员ajax
    	$("#adminsEdit").click(function(){
    		var editID = $("#editID").val();
    		$.ajax({
    			type:'POST',
    			url:'/admin/regulateedit/'+editID,
    			dataType:'json',
    			data:$("#formEdit").serialize(),
    			success:function(data){
    				if (data.status=='201'){
    					layer.msg(data.info,{icon:5});
    				}else if(data.status=='202'){
    					layer.msg(data.info,{icon:5,time:1500});
    					window.parent.location.reload();
    				}else{
    					layer.msg(data.info,{icon:1,time:1500});
    					window.parent.location.reload();
    				}
    			},
    			error:function(){
    				layer.msg('网络错误,稍后重试',{icon:5,time:1500});
    				window.parent.location.reload();
    			}
    		});
    	});
    	$('.skin-minimal input').iCheck({
    		checkboxClass: 'icheckbox-blue',
    		radioClass: 'iradio-blue',
    		increaseArea: '20%'
    	});
    	
    	$("#form-admin-add").validate({
    		rules:{
    			adminName:{
    				required:true,
    				minlength:4,
    				maxlength:16
    			},
    			password:{
    				required:true,
    			},
    			password2:{
    				required:true,
    				equalTo: "#password"
    			},
    			sex:{
    				required:true,
    			},
    			phone:{
    				required:true,
    				isPhone:true,
    			},
    			email:{
    				required:true,
    				email:true,
    			},
    			adminRole:{
    				required:true,
    			},
    		},
    		onkeyup:false,
    		focusCleanup:true,
    		success:"valid",
    		submitHandler:function(form){
    			$(form).ajaxSubmit({
    				type: 'post',
    				url: "xxxxxxx" ,
    				success: function(data){
    					layer.msg('添加成功!',{icon:1,time:1000});
    				},
                    error: function(XmlHttpRequest, textStatus, errorThrown){
    					layer.msg('error!',{icon:1,time:1000});
    				}
    			});
    			var index = parent.layer.getFrameIndex(window.name);
    			parent.$('.btn-refresh').click();
    			parent.layer.close(index);
    		}
    	});
    });
    </script> 
    <!--/请在上方写此页面业务相关的脚本-->
    </body>
    </html>
    

    管理员列表

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
    <meta id="farm_csrf" name="csrf-token" content="{{ csrf_token() }}"><重点:new insert>这个是处理laravel的CSRF验证
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
    <meta http-equiv="Cache-Control" content="no-siteapp" />
    <link rel="Bookmark" href="/favicon.ico" >
    <link rel="Shortcut Icon" href="/favicon.ico" />
    <!--[if lt IE 9]>
    <script type="text/javascript" src="admin/lib/html5shiv.js"></script>
    <script type="text/javascript" src="admin/lib/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui/css/H-ui.min.css")}} />
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui.admin/css/H-ui.admin.css")}} />
    <link rel="stylesheet" type="text/css" href={{asset("admin/lib/Hui-iconfont/1.0.8/iconfont.css")}} />
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui.admin/skin/default/skin.css")}} id="skin" />
    <link rel="stylesheet" type="text/css" href={{asset("admin/static/h-ui.admin/css/style.css")}}/>
    <!--[if IE 6]>
    <script type="text/javascript" src="admin/lib/DD_belatedPNG_0.0.8a-min.js" ></script>
    <script>DD_belatedPNG.fix('*');</script>
    <![endif]-->
    <title>管理员列表</title>
    </head>
    <body>
    <nav class="breadcrumb"><i class="Hui-iconfont">&#xe67f;</i> 首页 <span class="c-gray en">&gt;</span> 管理员管理 <span class="c-gray en">&gt;</span> 管理员列表 <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" href="javascript:location.replace(location.href);" title="刷新" ><i class="Hui-iconfont">&#xe68f;</i></a></nav>
    <div class="page-container">
    	{{--<div class="text-c"> 日期范围:--}}
    		{{--<input type="text" onfocus="WdatePicker({ maxDate:'#F{$dp.$D(\'datemax\')||\'%y-%M-%d\'}' })" id="datemin" class="input-text Wdate" style="width:120px;">--}}
    		{{-----}}
    		{{--<input type="text" onfocus="WdatePicker({ minDate:'#F{$dp.$D(\'datemin\')}',maxDate:'%y-%M-%d' })" id="datemax" class="input-text Wdate" style="width:120px;">--}}
    		{{--<input type="text" class="input-text" style="width:250px" placeholder="输入管理员名称" id="" name="">--}}
    		{{--<button type="submit" class="btn btn-success" id="" name=""><i class="Hui-iconfont">&#xe665;</i> 搜用户</button>--}}
    	{{--</div>--}}
    	<div class="cl pd-5 bg-1 bk-gray mt-20">
    		<span class="l">
    			{{--<a href="javascript:;" onclick="datadel()" class="btn btn-danger radius"><i class="Hui-iconfont">&#xe6e2;</i> 批量删除</a>--}}
    			<a href="javascript:;" onclick="admin_add('添加管理员','/admin/regulateadd','800','')" class="btn btn-primary radius">
    				<i class="Hui-iconfont">&#xe600;</i> 添加管理员</a>
    		</span> <span class="r">共有数据:<strong>54</strong> 条</span>
    	</div>
    	<table class="table table-border table-bordered table-bg">
    		<thead>
    			<tr>
    				<th scope="col" colspan="9">管理员列表</th>
    			</tr>
    			<tr class="text-c">
    				<th width="25"><input type="checkbox" name="" value=""></th>
    				<th width="40">ID</th>
    				<th width="150">登录名</th>
    				<th width="90">手机</th>
    				<th width="150">邮箱</th>
    				<th>角色</th>
    				<th width="130">加入时间</th>
    				<th width="100">是否已启用</th>
    				<th width="100">操作</th>
    			</tr>
    		</thead>
    		@foreach($data as $v)
    		<tbody>
    			<tr class="text-c">
    				<td><input type="checkbox" value="1" name=""></td>
    				<td>{{$v->id}}</td>
    				<td>{{$v->login_name}}</td>
    				<td>{{$v->tel}}</td>
    				<td>{{$v->email}}</td>
    				<td>
    					@if($v->group_name)
    						{{$v->group_name}}
    					@else
    						角色已删除
    					@endif
    				</td>
    				<td>{{date('Y-m-d H:i:s',$v->create_time)}}</td>
    				<td class="td-status">
    					@if($v->start==0)
    					<span class="label label-success radius">已启用</span>
    					@else
    						<span class="label label-default radius">已禁用</span>
    					@endif
    				</td>
    				<td class="td-manage">
    					@if($v->start==0)
    						<a style="text-decoration:none" onClick="admin_stop(this,{{$v->id}})" href="javascript:;" title="停用">
    							<i class="Hui-iconfont">&#xe631;</i>
    						</a>
    					@else
    						<a onClick="admin_start(this,{{$v->id}})" href="javascript:;" title="启用" style="text-decoration:none">
    							<i class="Hui-iconfont">&#xe615;</i>
    						</a>
    					@endif
    					<a title="编辑" href="javascript:;" onclick="admin_edit('管理员编辑','/admin/regulateedit/{{$v->id}}','1','800','')" class="ml-5" style="text-decoration:none">
    						<i class="Hui-iconfont">&#xe6df;</i>
    					</a>
    						<a title="修改密码" href="javascript:;" onclick="admin_regulateresetpwd('修改密码','/admin/regulateresetpwd/{{$v->id}}','1','800','')" class="ml-5" style="text-decoration:none">
    							<i class="Hui-iconfont">&#xe63f;</i>
    						</a>
    
    				</td>
    			</tr>
    		</tbody>
    		@endforeach
    	</table>
    </div>
    <!--_footer 作为公共模版分离出去-->
    <script type="text/javascript" src={{asset("admin/lib/jquery/1.9.1/jquery.min.js")}}></script>
    <script type="text/javascript" src={{asset("admin/lib/layer/2.4/layer.js")}}></script>
    <script type="text/javascript" src={{asset("admin/static/h-ui/js/H-ui.min.js")}}></script>
    <script type="text/javascript" src={{asset("admin/static/h-ui.admin/js/H-ui.admin.js")}}></script> <!--/_footer 作为公共模版分离出去-->
    
    <!--请在下方写此页面业务相关的脚本-->
    <script type="text/javascript" src={{asset("admin/lib/My97DatePicker/4.8/WdatePicker.js")}}></script>
    <script type="text/javascript" src={{asset("admin/lib/datatables/1.10.0/jquery.dataTables.min.js")}}></script>
    <script type="text/javascript" src={{asset("admin/lib/laypage/1.2/laypage.js")}}></script>
    <script type="text/javascript">
    /*
    	参数解释:
    	title	标题
    	url		请求的url
    	id		需要操作的数据id
    	w		弹出层宽度(缺省调默认值)
    	h		弹出层高度(缺省调默认值)
    */
    /*管理员-增加*/
    function admin_add(title,url,w,h){
    	layer_show(title,url,w,h);
    }
    /*管理员-删除*/
    function admin_del(obj,id){
    	layer.confirm('确认要删除吗?',function(index){
    		$.ajax({
    			type: 'POST',
    			url: 'admin/regulatestop',
    			dataType: 'json',
    			success: function(data){
    				$(obj).parents("tr").remove();
    				layer.msg('已删除!',{icon:1,time:1000});
    			},
    			error:function(data) {
    				console.log(data.msg);
    			},
    		});		
    	});
    }
    
    /*管理员-编辑*/
    function admin_edit(title,url,id,w,h){
    	layer_show(title,url,w,h);
    }
    function admin_regulateresetpwd(title,url,id,w,h){
    	layer_show(title,url,w,h);
    }
    /*管理员-停用*/
    <重点:new insert>这个是处理laravel的CSRF验证
    $.ajaxSetup({
    	headers: {
    		'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    	}
    });
    function admin_stop(obj,id){
    	//alert('停用'+id);
    	layer.confirm('确认要停用吗?',function(index){
    		//此处请求后台程序,下方是成功后的前台处理……
    		$.ajax({
    			type:'POST',
    			url:'/admin/regulatestop/'+id,
    			//dataType:'json',
    			data:{"start":'1'},
    			success:function(data){
    				//TODO <winner sign>js的逻辑有点问题,在上面用if判断执行启用停用操作
    				{{--$(obj).parents("tr").find(".td-status").html('<span class="label label-default radius">@if($v->start==1)已禁用@endif</span>');--}}
    				//$(obj).remove();
    				{{--$(obj).parents("tr").find(".td-manage").prepend('<a onClick="admin_start(this,{{$v->id}})" href="javascript:;" title="启用" style="text-decoration:none"><i class="Hui-iconfont">&#xe615;</i></a>');--}}
    				layer.msg('已停用!',{icon: 5,time:1000});
    				//刷新本页面,功能跟页面上右上角的刷新一样。
    				window.location.replace(location.href);
    			},error:function(){
    				layer.msg('网络错误,稍后再试!',{icon: 5,time:1000});
    			}
    		});
    	});
    }
    
    /*管理员-启用*/
    function admin_start(obj,id){
    	//alert('启用'+id);
    	layer.confirm('确认要启用吗?',function(index){
    		//此处请求后台程序,下方是成功后的前台处理……
    		$.ajax({
    			type:'POST',
    			url:'/admin/regulatestop/'+id,
    			//dataType:'json',
    			data:{"start":'0'},
    			success:function(data){
    				//TODO <winner sign>js的逻辑有点问题,在上面用if判断执行启用停用操作
    				{{--$(obj).parents("tr").find(".td-manage").prepend('<a onClick="admin_stop(this,{{$v->id}})" href="javascript:;" title="停用" style="text-decoration:none"><i class="Hui-iconfont">&#xe631;</i></a>');--}}
    				{{--$(obj).parents("tr").find(".td-status").html('<span class="label label-success radius">@if($v->start==0)已启用@endif</span>');--}}
    				// $(obj).remove();
    				layer.msg('已启用!', {icon: 6,time:1000});
    				//刷新本页面,功能跟页面上右上角的刷新一样。
    				window.location.replace(location.href);
    			},
    			error:function(){
    				layer.msg('网络错误,稍后再试!',{icon: 5,time:1000});
    			}
    		});
    		
    
    	});
    }
    </script>
    </body>
    </html>
    

    我只是一个小白,增加,修改分开写的,哪位小伙伴可以结合在一起,欢迎修改。

    展开全文
  • Laravel表单验证验证规则

    千次阅读 2019-12-11 17:22:03
    1 表单校验 ...这个 trait 在你所有的控制器里提供了方便的 validate 验证方法。...validate 方法会接收 HTTP 传入的请求以及验证规则。如果验证通过,你的代码就可以正常的运行。若验证失败,则会抛出异常错误消息并...

    1 表单校验

    检查应用程序的基底控制器 (App\Http\Controllers\Controller) 类你会看到这个类使用了 ValidatesRequests trait。这个 trait 在你所有的控制器里提供了方便的 validate 验证方法。

    validate 方法会接收 HTTP 传入的请求以及验证的规则。如果验证通过,你的代码就可以正常的运行。若验证失败,则会抛出异常错误消息并自动将其返回给用户。在一般的 HTTP 请求下,都会生成一个重定向响应,对于 AJAX 请求则会发送 JSON 响应。

    \vendor\laravel\framework\src\Illuminate\Foundation\Validation\ValidatesRequests.php

    public function validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
    {
        $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);
     
        if ($validator->fails()) {
            $this->throwValidationException($request, $validator);
        }
    

    了解了表单验证的原理,那接下来我们就使用控制器自带的 validate 方法进行校验吧!

    首先,通过表单,我们了解到需要校验的字段包括了:name, age, sex

    \app\Http\Controllers\StudentController.php

    public function create(Request $request)
    {
        // 判断是POST请求,也就是提交表单时走这个区间
        if($request->isMethod('POST'))
        {
            // 校验
            $this->validate($request, [
                'Student.name' => 'required|min:2|max:20',
                'Student.age' => 'required|integer',
                'Student.sex' => 'required|integer',
            ]);
    

    此时,我们尝试提交表单(注意:此处可以不填写任何内容),发现无法提交成功。因为当验证无法通过时,程序会抛出异常,不往下执行。

    2 显示失败信息

    好了,接下来我们就让表单的验证信息输出吧!之前,我们表单上的失败信息,就该派上用场了! GO!!!1

    显示验证错误原理:如果本次请求的参数未通过我们指定的验证规则呢?正如前面所提到的,Laravel
    会自动把用户重定向到先前的位置。另外,所有的验证错误会被自动 闪存至 session。请注意我们并不需要在 GET
    路由中明确的将错误消息绑定到视图上。这是因为 Laravel 会自动检查 session
    内的错误数据,如果错误存在的话,它会自动将这些错误消息绑定到视图上。因此需要的注意一点是 $errors
    变量在每次请求的所有视图中都可以被使用,你可以很方便的假设 errors使errors 变量已被定义且进行安全地使用。errors 变量是
    Illuminate\Support\MessageBag 的实例。

    出处:http://d.laravel-china.org/docs/5.2/validation#validation-quickstart

    \resources\views\shared\message.blade.php

    @if(count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach($errors->all() as $error)
            <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    @endif
    

    在这里插入图片描述

    3 表单校验信息转化成中文

    创建Request
    php artisan make:request CreateUserRequest
    CreateUserRequest代码块 ,校验方法如下:

    // 校验
    <?php
    
    namespace App\Http\Requests;
    
    use App\Http\Requests\Request;
    
    class CreateUserRequest extends Request
    {
            //验证规则可自己添加需要验证的字段
        protected $rules = [    
            'Student.userName' => 'required|between:2,4',
            'Student.userAge' => 'required|integer',
            'Student.userSex' => 'required|integer',
            'Student.addr' => 'required',
        ];
        //这里我只写了部分字段,可以定义全部字段
        protected $strings_key = [
            'Student.userName' => '用户名',
            'Student.userAge' => '年龄',
            'Student.userSex' => '性别',
            'Student.addr' => '地址',
        ];
        //这里我只写了部分情况,可以按需定义
        protected $strings_val = [
            'required'=> '为必填项',
            'min'=> '最小为:min',
            'max'=> '最大为:max',
            'between'=> '长度在:min和:max之间',
            'integer'=> '必须为整数',
            'sometimes'=> '',
        ];
    
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;//修改为true
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
    
            $rules = $this->rules;
            // 根据不同的情况, 添加不同的验证规则
            if (Request::getPathInfo() == '/save')//如果是save方法
            {
                $rules['Student.addr'] = 'sometimes';
            }
            if (Request::getPathInfo() == '/edit')//如果是edit方法
            {
                $rules['Student.addr'] = 'required|min:5';
            }
            return $rules;        
    
        }
      //返回给前台的错误信息
        public function messages(){
            $rules = $this->rules();
            $k_array = $this->strings_key;
            $v_array = $this->strings_val;
            foreach ($rules as $key => $value) {
                $new_arr = explode('|', $value);//分割成数组
                foreach ($new_arr as $k => $v) {
                    $head = strstr($v,':',true);//截取:之前的字符串
                    if ($head) {$v = $head;}
                    $array[$key.'.'.$v] = $k_array[$key].$v_array[$v];                  
                }
            }
            return $array;
        }
    }
    

    控制器具体方法

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function save(\App\Http\Requests\CreateUserRequest $request)
    {
            //这里会自动调用表单验证
            //验证成功后继续向下执行
            $data = $request->input('Student');
            if(User::create($data)){
               return redirect('/')->with('success', '添加成功!');
            }else{
               return redirect('/create')->with('error', '添加失败!'); 
            }
    }
    

    对应的模板文件即视图文件,使用 {{ $errors->first(‘Student.name’) }} 可以只显示第一条错误信息:

    <form class="form-horizontal" method="post" action="{{ url('student/create') }}">
        {{ csrf_field() }}
        <div class="form-group">
            <label for="name" class="col-sm-2 control-label">姓名</label>
     
            <div class="col-sm-5">
                <input type="text" name="Student[name]" class="form-control" id="name" placeholder="请输入学生姓名">
            </div>
            <div class="col-sm-5">
                <p class="form-control-static text-danger">{{ $errors->first('Student.name') }}</p>
            </div>
        </div>
        <div class="form-group">
            <label for="age" class="col-sm-2 control-label">年龄</label>
     
            <div class="col-sm-5">
                <input type="text" name="Student[age]" class="form-control" id="age" placeholder="请输入学生年龄">
            </div>
            <div class="col-sm-5">
                <p class="form-control-static text-danger">{{ $errors->first('Student.age') }}</p>
            </div>
        </div>
        <div class="form-group">
            <label class="col-sm-2 control-label">性别</label>
     
            <div class="col-sm-5">
                <label class="radio-inline">
                    <input type="radio" name="Student[sex]" value="2"> 未知
                </label>
                <label class="radio-inline">
                    <input type="radio" name="Student[sex]" value="1"></label>
                <label class="radio-inline">
                    <input type="radio" name="Student[sex]" value="0"></label>
            </div>
            <div class="col-sm-5">
                <p class="form-control-static text-danger">{{ $errors->first('Student.sex') }}</p>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-primary">提交</button>
            </div>
        </div>
    </form>
    

    此时表单提交的功能就完成大半啦,但是不能够保存上一次输入的信息,还是不够完美!那下一步就完善一下。

    4 表单信息保持

    闪存输入数据至 Session 后重定向。

    你可能需要将输入数据闪存并重定向至前一页,这时只要在重定向方法后加上 withInput 即可。

    // 模型的添加方法
    $ret = Student::insert($data);
    if($ret)
    {
        return redirect('/')->with('success', '添加成功!')->withInput();
    } else{
        return redirect('student/create')->with('error', '添加失败!')->withInput();
    }
    

    在表单的标签上加上 value 属性值。如 {{ old(‘Student’)[‘name’] }}

    <form class="form-horizontal" method="post" action="{{ url('student/create') }}">
        {{ csrf_field() }}
        <div class="form-group">
            <label for="name" class="col-sm-2 control-label">姓名</label>
     
            <div class="col-sm-5">
                <input type="text" value="{{ old('Student')['name'] }}" name="Student[name]" class="form-control" id="name" placeholder="请输入学生姓名">
            </div>
            <div class="col-sm-5">
                <p class="form-control-static text-danger">{{ $errors->first('Student.name') }}</p>
            </div>
        </div>
        <div class="form-group">
            <label for="age" class="col-sm-2 control-label">年龄</label>
     
            <div class="col-sm-5">
                <input type="text" value="{{ old('Student')['age'] }}" name="Student[age]" class="form-control" id="age" placeholder="请输入学生年龄">
            </div>
            <div class="col-sm-5">
                <p class="form-control-static text-danger">{{ $errors->first('Student.age') }}</p>
            </div>
        </div>
        <div class="form-group">
            <label class="col-sm-2 control-label">性别</label>
     
            <div class="col-sm-5">
                <label class="radio-inline">
                    <input type="radio" name="Student[sex]" {{ (isset(old('Student')['sex']) && old('Student')['sex'] == '2') ? 'checked' : '' }} value="2"> 未知
                </label>
                <label class="radio-inline">
                    <input type="radio" name="Student[sex]" {{ (isset(old('Student')['sex']) && old('Student')['sex'] == '1') ? 'checked' : '' }} value="1"></label>
                <label class="radio-inline">
                    <input type="radio" name="Student[sex]" {{ (isset(old('Student')['sex']) && old('Student')['sex'] == '0') ? 'checked' : '' }} value="0"></label>
            </div>
            <div class="col-sm-5">
                <p class="form-control-static text-danger">{{ $errors->first('Student.sex') }}</p>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-primary">提交</button>
            </div>
        </div>
    </form>
    

    在这里插入图片描述

    第一种:控制器验证

    控制器内容

    if ($request->isMethod('POST')) {
            $this->validate($request, [
                'Student.name' => 'required|min:2|max:20',
                'Student.age' => 'required|integer|max:100',
                'Student.sex' => 'required|integer',
            ], [
                'required' => ':attribute 为必填项',
                'min' => ':attribute 长度小于范围',
                'max' => ':attribute 长度超出范围',
                'integer' => ':attribute 必须为整数',
            ], [
                'Student.name' => '姓名',
                'Student.age' => '年龄',
                'Student.sex' => '性别',
            ]);
    
            $data = $request->input('Student');
    
            if (Student::create($data)) {
                return redirect('student/index')->with('success','添加成功');
            } else {
                return redirect()->back()->with('error', '添加失败');
            }
        }
        return view('student.create');
    

    如果控制器中代码验证通过了(validate),那么会执行之后的代码,如果没有通过,框架会抛出一个异常,自动返回上一个页面;
    错误信息被存到Session中了,并且将它绑定到视图;

    第二种: Validator验证

    控制器中:
    使用\Validator::make创建验证:

     if ($request->isMethod('POST')) {
        $validator = \Validator::make($request->input(), [
            'Student.name' => 'required|min:2|max:20',
            'Student.age' => 'required|integer|max:100',
            'Student.sex' => 'required|integer',
        ], [
            'required' => ':attribute 为必填项',
            'min' => ':attribute 长度小于范围',
            'max' => ':attribute 长度超出范围',
            'integer' => ':attribute 必须为整数',
        ], [
            'Student.name' => '姓名',
            'Student.age' => '年龄',
            'Student.sex' => '性别',
        ]);
    

    fails()代表验证失败,withErrors($validator)则为手动绑定错误信息

        if($validator->fails()) {
            return redirect()->back()->withErrors($validator);
        }
        $data = $request->input('Student');
    
        if (Student::create($data)) {
            return redirect('student/index')->with('success','添加成功');
        } else {
            return redirect()->back()->with('error', '添加失败');
        }
    }
    return view('student.create');
    }
    

    视图中调用错误信息

    <p class="form-control-static text-danger">{{ $errors->first('Student.name') }}</p>
    

    数据保持

    (作用:验证失败时不用重新输入表单数据)

    withInput() 默认将$request数据全部放进去

      return redirect()->back()->withErrors($validator)->withInput();
    

    视图中调用$errors的old方法:

    普通input框:value="{{ old('Student')['age'] }}"
    
    单选框:{{ old('Student.sex') == 0 ? "checked='checked'" : '' }}
    
    展开全文
  • Laravel 表单验证常用的验证规则和示例 <?php namespace App\Http\Controllers; use App\Models\Users; use Illuminate\Support\Facades\Validator; use Symfony\Component\HttpFoundation\Request; class ...

    Laravel 表单验证常用的验证规则和示例

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Models\Users;
    use Illuminate\Support\Facades\Validator;
    use Symfony\Component\HttpFoundation\Request;
    
    class UsersController extends Controller
    {
    
        // 添加用户post数据验证
        public function create(Request $request)
        {
            if($request->isMethod('POST')) {
                $data = $request->input('users');
                // 1.控制器的验证演示 Controller中 use ValidatesRequests 就可以直接调用;
                // blade中HTML中form表单中name的传值演示
                // <input name="users[u_mobile]" placeholder="请输入" class="layui-input"
                // type="text">
                // <input name="u_gender" value="1" type="radio"><input name="u_gender"
                // value="2" type="radio">
                $this->validate($request,[
                    // 以下正则验证都是自己随意编写的并没有严格去验证,如需要严格的请自行编写或百度,
                    //#此处只为重点讲Laravel可用验证用法
                    //required必须输入 unique 唯一(在users表中u_mobile[手机号]为唯一,不
                    //允许重复,regex表达式验证)
                    //此处要用多个条件验证和regex正则建议采用[]形式中间用逗号分隔
                    'users.u_mobile'        => [
                        'required',
                        'unique:users',
                        'regex:/^1[3|4|5|7|8][0-9]{9}$/',
                    ],
                    // 如果是一维数组直接'u_mobile'就可以了;
                    // 编辑过程中验证唯一示例如:
                    //'users.u_mobile'=>['required',
                    //Rule::unique('users')->ignore($user->id),
                    //'regex:/^1[3|4|5|7|8][0-9]{9}$/'],
                    // $user为查出的用户对象,ignore是为了强迫Unique规则忽略指定ID($user->id)
                    //再进行判断唯一,
                    //如果不是在控制器中使用validate验证你可以采用request('id')来获取指定id,
                    //request为一个辅助函数很实用
                    'users.u_qq'            => ['required','regex:/^[1-9][0-9]{4,}$/'],
                    // QQ号 还可采用简写 'users.u_qq' => 'required|regex:/^[1-9][0-9]{4,}$/',
                    'users.u_email'         => [
                        'required',
                        'unique:users',
                        'regex:/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/',
                    ],
                    // 大概的邮箱验证
                    'u_gender'              => 'required|in:1,2',
                    // in 的用法用户性别只能输入1和2(男/女)  此处采用中划线的形式验证
                    //     如果文字也可以设置为 'required|in:男,女'
                    'users.u_nickname'      => [
                        'required',
                        'regex:/^[_\w\d\x{4e00}-\x{9fa5}]{3,20}$/iu',
                    ],
                    // 随意写的用户名验证
                    /*****以下开始重点演示可用的验证用法,
                     * 有些命名属性和users几乎无什么关联了,重点看验证规则写法,其它的并不重要***
                     */
                    'salary'                => 'required|integer|min:1000',
                    // 工资 integer必须为整数,但是数字必须不能超过2147483647否则它将判断为“不是整数”,
                    // min最小值为1000
                    // nullable 允许输入为空,
                    // required_if如果用户性别选择了为1那么input中属性name="name"输入框就必须要填写
                    'users.name'  => 'nullable|required_if:u_gender,1|string|between:1,10',
                    // between 之间(包括1和10) 姓名必须在字数1位和10位之间
                    'tel'                   => [
                        'nullable',
                        'regex:/^((0\d{2,3}-?)?\d{7,8})|(1[3-9]\d{9})$/',
                    ],
                    // 联系电话(座机号和手机号都可以),输入可以为空,但有输入值时就必须按照正则验证
                    'users.id_no'           => [
                        'required',
                        'regex:/(^\d{17}[0-9xX]{1}$)|(^\d{14}[0-9xX]{1}$)/',
                    ],
                    // 身份证号码验证(包括15位的验证)
                    'users.age'             => ['nullable','integer','regex:/^[1-9][0-9]?$/'],
                    //年龄 也可以尝试中划线形式:'nullable|integer|regex:/^[1-9][0-9]?$/'
                    // 余额 numeric必须为数字,max最大值为922337203685477
                    // 但是max设置为9223372036854771
                    //但用户输入9223372036854772、9223372036854773 也可以验证通过
                    // max设置为9223372036854775807 但输入 9223372036854775808、
                    //9223372036854775809
                    // 还是会通过 所以max还有些缺陷请谨慎使用!
                    // 同样的问题在 between用于数字类型的精确的范围之间验证也会出现问题,
                    //如:between:1,9223372036854771
                    // 输入9223372036854773 也会通过,也需要注意!!! 
                    'balance'               => 'nullable|numeric|min:1|max:922337203685477',
                    //max如果是数字类型,最大为922337203685477内能精确验证,超过了可能出现问题.
                    //html模版如: 互联网<input type="checkbox" name="industry_nos[]" value="1">
                    // 建筑<input type="checkbox" name="industry_nos[]" value="2">
                    'industry_nos'          => 'required|array',
                    // 行业  array 验证的字段必须是一个php数组
                    'industry_nos.*'        => 'integer|distinct|between:1,6',
                    // 整数必须在1和6之间 distinct 指定的字段不能有任何重复值
                    'telephone'             => ['required_without:id_no','regex:/^1[3-9]\d{9}$/'],
                    // 手机号 required_without 只要id_no字段不存在,telephone那么就必须存在且不能为空
                    'id_no'                 => [
                        'required_without:telephone',
                        'regex:/(^\d{17}[0-9xX]{1}$)|(^\d{14}[0-9xX]{1}$)/',
                    ],
                    // 身份证号码 只要telephone不存在,那么id_no就必须存在不能为空
                    //html模版如: 密码二次确认
                    // <input type="password" name="password" />
                    // <input type="password" name="password_confirmation" />
                    'password'              => 'required|min:6|confirmed',
                    // confirmed 验证的字段必须和password_confirmation 保持一样否则就会验证不成功
                    'password_confirmation' => 'required|min:6',
                    // password_confirmation会验证和confirmed一致
                    'pics'                  => 'required|json|not_in:[]',
                    // json必须为有效的json字符串,not_in不能为包含给定的值[]
                    'birthday'              => 'nullable|date',
                    // 验证的字段值必须是通过PHP函数strtotime校验的有效日期
                    'start_date'            => 'nullable|date_format:Y-m-d',
                    //开始时间 date_format 验证的字段必须与给定的时间格式相匹配
                    'amount'                => ['required','numeric','regex:/^\d{1,14}$/'],
                    // 正则允许的最大为: 99999999999999,超过即为不合法
                    //msyql bigint带符号的最大值为9223372036854775807,
                    //但php中如果位数超过14将采用科学计数法如果采用max不太合适,
                    //所以先默认使用上面的正则验证方法
                ],[
                    'required' => ':attribute为必填项',//:attribute 字段占位符表示字段名称
                    'regex'    => ':attribute格式不正确',
                    'unique'   => ':attribute已经存在',
                    'integer'  => ':attribute必须为整数',
                    'min'      => ':attribute不能小于6位',
                    'email'    => ':attribute格式不正确',
                    'in'       => ':attribute必须选择',
                    'max'      => ':attribute大于了10位',
                    // 此处开始省略..就不再继续编写了,写法同上面都差不多,自行编写即可
                ],[
                    'users.u_mobile'   => '手机号码', //指定字段名称
                    'users.u_qq'       => 'QQ号码',
                    'users.u_email'    => '联系邮箱',
                    'u_gender'         => '用户性别',
                    'users.u_nickname' => '用户昵称',
                    // 此处开始省略..就不再继续编写了,写法同上面都差不多,自行编写即可
                ]);
                // 2. validator类验证演示---------------
                /*$validator=Validator::make($request->input(),[
                           'users.u_mobile'=>['required','unique:users',
                            'regex:/^1[3|4|5|7|8][0-9]{9}$/'],//如果是一维数组直接'u_mobile'就可以了;
                           'users.u_qq'=>['required','regex:/^[1-9][0-9]{4,}$/'],
                           'users.u_email'=>'required|unique:users|email',
                           'users.u_gender'=>'required|in:0,1,2',
                           'users.u_nickname'=>['required',
                            'regex:/^[_\w\d\x{4e00}-\x{9fa5}]{3,20}$/iu'],
                       ],[
                           'required'=>':attribute为必填项',//:attribute 字段占位符表示字段名称
                           'regex'=>':attribute格式不正确',
                           'unique'=>':attribute已经存在',
                           'integer'=>':attribute必须为整数',
                           'min'=>':attribute不能小于6位',
                           'email'=>':attribute格式不正确',
                           'in'=>':attribute必须选择',
                           'max'=>':attribute大于了10位',
                       ],[
                           'users.u_mobile'=>'手机号码', //指定字段名称
                           'users.u_qq'=>'QQ号码',
                           'users.u_email'=>'联系邮箱',
                           'users.u_gender'=>'用户性别',
                           'users.u_nickname'=>'用户昵称',
                       ]);
         
                        if($validator->fails()){
                           abort(422, $validator->errors()->first());
                        }*/
            }
        }
    }
    

    可以研究下框架中验证类的源码: \vendor\laravel\framework\src\Illuminate\Validation\Concerns\ValidatesAttributes.php 

     

    文章地址: https://blog.csdn.net/websites/article/details/89876884

     

    展开全文
  • 首先创建Request:项目中我是在app->...验证文件(CreateUserValidate) 这个文件夹建立的验证 CreateUserValidate代码块 1 <?php 2 3 namespace App\Http\Requests\User; 4 ...
  • laravel表单验证

    2019-06-21 11:41:06
    1.使用命令行工具创建request ... ...3.修改authorize方法内的值为true 4.在rules方法内创建表单验证规则 5.创建message方法自定义表单验证返回消息 6.最后在要使用该表单验证的地方,把方法内的Request...
  • public function rules(){ return [  'm_pushing_frequency_level_id' => 'integer|required|exists:m_pushing_frequency_...}我看到laravel学院上是exists:table.column这么写的,但是我这样写,他报 local...
  • Laravel 表单验证

    2018-02-01 17:13:37
    //注意:在使用正则验证规则时候,验证规则必须为数组 $int_regex = ['required','regex:/^[1-9]\d*$/']; //必须|整数且大于0  //规则 $rules = array(  'parent_member_id' => $int_regex,  'n
  • 验证的文件是图片并且图片比例必须符合规则,比如dimensions:min_width=100,min_height=200,可用 的规则有min_width,max_width,min_height,max_height,width,height,ratio', 'distinct' =&...
  • laravel 表单验证

    2017-07-11 19:33:12
    基础验证例子 ...传递给 make 函数的第一个参数是待验证的数据,第二个参数是对该数据需要应用的验证规则。 多个验证规则可以通过 "|" 字符进行隔开,或者作为数组的一个单独的元素。 通过数组指定

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,097
精华内容 438
关键字:

laravel表单验证规则