Warning: Use of undefined constant HTTP_USER_AGENT - assumed 'HTTP_USER_AGENT' (this will throw an Error in a future version of PHP) in /www/wwwroot/www.caiwuje.cn/wp-content/themes/seven/header.php on line 1
最适合入门的Laravel中级教程(三)表单验证 | 超纯洁博客

最适合入门的Laravel中级教程(三)表单验证

做开发有个原则是永远不能信任用户输入的数据;
即便前端已经做了验证;
在后端 php 也必须要再次验证;
laravel 为表单验证提供了强大且简单的方案;
创建示例路由:
routes/web.php
Route::prefix('validation')->group(function () {
Route::get('create', 'ValidationController@create');
Route::post('store', 'ValidationController@store');
Route::get('edit', 'ValidationController@edit');
Route::post('update', 'ValidationController@update');
});
PHPCopy
创建控制器
php artisan make:controller ValidationController --resource
BashCopy
app/Http/Controllers/ValidationController.php
public function create()
{
return view('validation.create');
}
PHPCopy
创建视图;
这里直接把官方自带的注册页面复制过来做示例了;
为了方便验证后台我把 html 标签的验证删除了;
并增加了一个 tag 选项;
resources/views/validation/create.blade.php
@extends('layouts.app')
@section('content')

注册
{{ csrf_field() }}

@if ($errors->has('tag'))

{{ $errors->first('tag') }}

@endif

@if ($errors->has('name'))

{{ $errors->first('name') }}

@endif

@if ($errors->has('email'))

{{ $errors->first('email') }}

@endif

@if ($errors->has('password'))

{{ $errors->first('password') }}

@endif

@endsection
HTMLCopy
现在到了后台验证的时候了;
laravel 可以直接在控制器中直接写验证逻辑;
不过我建议单独创建验证类;
以控制器名为目录;
以方法名为文件名;
这里为 store 方法创建一个验证类;
php artisan make:request Validation/Store
BashCopy
执行命令会生成 app/Http/Requests/Validation/Store.php 文件;
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
];
}
PHPCopy
这些规则都可以在文档中找到表单验证 ;
要使用这个验证器也很简单;
只需要在 store 方法的类型约束中使用 Store 即可;
use App\Http\Requests\Validation\Store;
public function store(Store $request)
{
dump($request->all());
}
PHPCopy
增加验证后我们访问 /validation/create 页面点击注册按钮;
当点击注册按钮的时候会刷新下页面并显示红色的提示信息;
但是提示信息全是英文;
要想显示中文我们可以翻译 resources/lang/en/validation.php 文件中的内容;
另外 overtrue 有一个翻译好的扩展包可以供我们使用 laravel-lang ;
composer require "overtrue/laravel-lang:~3.0"
BashCopy
在 config/app.php 文件中把 Illuminate\Translation\TranslationServiceProvider::class, 替换成 Overtrue\LaravelLang\TranslationServiceProvider::class,;
再次点击注册按钮就可以看到中文的提示信息了;
但是我们可以看到 tag 并没有被翻译出来;
像这类非通用性的字段;
我们可以在验证类 app/Http/Requests/Validation/Store.php 中定义 attributes 方法;
在方法中以键值对的方式翻译字段;
public function attributes()
{
return [
'tag' => '标签',
];
}
PHPCopy
再次刷新页面;
标签是翻译过来了;
但是我明明一个下拉选择标签但是提示却是输入类型的不能为空;
叔可以忍婶婶是忍不了了;
像这类情况我们还可以在验证类 app/Http/Requests/Validation/Store.php 中定义一个 messages 方法;
在方法中以字段拼接验证类型来翻译字段和验证类型的错误信息;
public function messages()
{
return [
'tag.required' => '必须选择标签',
];
}
PHPCopy
泼飞克特;
终于如愿以偿;
验证失败的信息都是在 session 中存储;
可以使用 session() 获取到失败的信息;
另外 laravel 还在 app/Http/Kernel.php 中注册了 ShareErrorsFromSession 中间件;
它的作用是可以让我们在视图文件直接使用储存了错误信息的变量 $errors ;

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
联系站长
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论