Laravel使用记录(九)表单验证(二)

表单请求

经过上述处理,确实可以起到表单验证的功能,但是结果或许不是我们期望的,就拿输出的错误提示来说吧,我们一般需要的是中文。Laravel也考虑到了这点,所以给我们提供了表单请求

注意事项

正式开始之前,我们需要变更下控制器的结构,上述是通过控制器的一个方法处理两种请求,但是这在使用表单请求的时候是行不通的,我们需要建立两个方法,分别处理GET和POST。
路由

    Route::get('register', 'IndexController@register');
    Route::post('registerStore','IndexController@registerStore');

控制器方法

    public function register()
    {
        return view('home.index.register');
    }

    public function registerStore()
    {
    }

视图文件

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
<form method="post" action="{{url('registerStore')}}">
	<p>username:<input type="text" name="username"/></p>
    <p>password:<input type="password" name="password"/></p>
    <p>{{ csrf_field() }}
    <input type="submit" value="submit"></p>
</form>

新建表单请求
我们仍然通过artisan创建,命令如下。

php artisan make:request RegisterRequest

新建的表单请求文件会出现在app/Http/Requests文件夹下,具体内容如下。
表单请求文件

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RegisterRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
        
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

如何使用?

1.在rules中填入验证规则

表单请求文件

    public function rules()
    {
        return [
            'username'=>'bail|required|alpha_dash|min:6',
            'password'=>'bail|required|alpha_dash|min:6',
        ];
    }
2.控制器中引入表单请求

只需要use下,并且在需要使用该表单请求的方法中注入该类即可,其他无需任何操作。
控制器

use App\Http\Requests\RegisterRequest;
public function registerStore(RegisterRequest $request)
{
}

完成这两部就成功了吗?我们测试了一下,居然报错了。
HTTP状态码:403

This action is unauthorized.

或许你猜到了些什么,不错就跟我们刚才看到的表单请求文件中的authorize方法有关。

这个方法旨在验证用户是否有权限进行该请求,默认返回false,没有权限。如果我们需要进行权限判断,例如我们只需要某个URI具有该请求权限,我们就可以书写对应逻辑关系,满足条件的话返回true不满足,返回false。如果没有特别需求,可以直接返回true。
表单请求文件

    public function authorize()
    {
        return true;
        
    }

此时我们再次提交表单,是不是出现了跟表单验证(一)中同样的效果。但是我们控制器方法中却没有书写任何的代码,是不是更简单了。

设置中文提示

有些朋友可能会问,说了这么多,不还是没有提到开头说的中文提示的问题,不要着急,马上就来。

除了authorize和rules之外,我们还可以在该文件中添加新的方法messages,该方法就是用来改变提示信息的。
表单请求文件

    public function messages()
    {
        return [
            'username.required'=>'用户名必填',
        ];
    }

return的是一个数组,数组的键名就是字段名“点”验证规则,键值就是对应的提示信息。例如username.required就是把字段名为username的字段和required的验证规则结合,当用户输入为空的时候,就会提示用户名必填的中文提示了,替换了原有的The username field is required的英文提示。

但是如果每个都这么改的话,确实有些浪费时间,有没有更简单的办法呢?其实也很简单,只需要再添加attributes方法,并跟messages相结合。

    public function attributes()
    {
        return [
            'username' => '用户名',
            'password' => '密码',
        ];
    }

    public function messages()
    {
        return [
            'required'=>':attribute必填',
            'alpha_dash'=>':attribute输入的字符必须是数字,字母,-或者_',
            'min'=>':attribute不少于:min个字符',
        ];
    }

attributes方法用来设置提示中的字段名称,暂且假定你的messages没有设置,只设置了attributes,那么你的错误提示就会变为"The 用户名 field is required."。当然这也不是我们需要的结果,因此我们需要更改messages。但是如果是字段名点验证规则的改法,那么attributes就没有任何意义了。为了简化我们的设置,不再进行重复劳动,Laravel给我们提供了占位符:attribute,在提示信息中输入占位符,它会被验证字段的实际名称取代。除了属性占位符,还有其它占位符,例如:min,:max等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章