股票场内基金交易,没时间盯盘?
Form Request验证方式
前言
上一节主要针对时间、日期方面做了些讲解。本节依然是对文章创建方面的完善,对表单的验证方面进行一个讲解。
说明
开发环境:windows 7
laravel版本: 5+
IDE: phpstorm
新的问题
截止上节,当我们的“标题”、“文章”什么都不填然后点击“提交”按钮后(你可以试试),依然能发表文章。这显然是不对的。
我们该怎么解决这个问题,直觉上,至少我们应该对这些表单的内容是否为空进行判断。但是放到laravel中它提供了更方便的方式进行表单验证,下面我们看一下。
两种解决方案
通过Form Request
laravel的Form Request功能提供了标准化验证,所有需要验证的过程或行为都被规范到Form Request这个类中。这个类中有两个方法:authorize()和rules()。authorize()方法是用来判断用户是否有权限做出此次请求;rules()是将需要约束的属性放到一个数组中返回。
下面我们创建一个Form Request。
1 2 |
php artisan make:request CreateArticleRequest |
此时会在app/Http/Requests/下面生成创建出一个新的类,名为CreateArticleRequest。打开该类可以看到两个默认存在的方法:authorize()和rules()。
对于authorize(),我们置为true,因为目前来说我们没有“用户”这个概念,所有打开articles/create页面的人都可以创建文章,所以都授权。你可以试试false。
对于rules(),也就是“规则”,我们要在这个方法里定义一些规则来约束表单的请求。我们的表单中有哪些不能为空?标题(title)、内容(body)和时间(publish_at)。
这里我们将这些不能为空的字段放到rules()的数组中:
1 2 3 4 5 6 7 8 |
public function rules(){ return [ 'title'=>'required', 'body'=>'required', 'published_at'=>'required', ]; } |
写好之后打开ArticleController.php,将store()方法修改如下:
1 2 3 4 5 |
public function store(CreateArticleRequest $request){ Article::create($request->all()); return redirect('articles'); } |
store()方法的形参变成了CreateArticleRequest类。背后的运作机理是这样的:当用户在创建文章点击提交按钮后,这个请求首先被laravel的CreateArticleRequest.php截取到进行各项验证,包括标题、内容、日期,他们是否为空、是否符合规则(比如标title至少3个字符、published_at是date格式)。如果这一切都满足规则才到store()方法体中进行执行。
修改完之后,启动服务器,打开浏览器看一下效果。在地址栏输入localhost:8888/articles/create,什么都不填点击提交按钮。不会跳转到文章列表页面,也没提示,这不太友好。
那我们写一个提示吧
打开resources\views\articles\create.blade.php,在{!! Form::close()!!}下面添加如下代码:
1 2 3 4 5 6 7 8 |
@if ($errors->any()) <ul class="alert alert-danger"> @foreach($errors->all() as $error) <li>{{$error}}</li> @endforeach </ul> @endif |
此时保存并在浏览器打开create页面的时候会报错,说找不到errors这个变量,具体错误原因请看这里。
这里简单提一嘴,这个变量是laravel 5.2里不提供的,5.2之前的版本都是默认自带的。
那么怎么让它提供呢,打开app/Http/routes.php,将之前所有的Routes路由都包在Route::group([‘middleware’ => [‘web’]], function () {…});中:
1 2 3 4 5 6 7 8 |
Route::group(['middleware' => ['web']], function () { Route::get('/', function () {return view('welcome');}); Route::get('articles', 'ArticlesController@index'); Route::get('articles/create', 'ArticlesController@create'); Route::get('articles/{id}', 'ArticlesController@show'); Route::post('articles', 'ArticlesController@store'); }); |
此时再打开create页面就不会报错。
此时再提交留空表单,会看到下方有红色的提示字体。
不用Form Request
什么叫不用Form Request?就是不使用Form Request了呗。打开ArticleController.php,看一下父类Controller的细节,发现:
1 2 3 4 5 |
class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; } |
父类已经引入了ValidatesRequests,所以我们的验证方式可以在controller中完成。
再看一下ValidatesRequests的细节:
1 2 3 4 5 6 7 |
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); } } |
这个方法内通过验证工厂类对请求进行验证,这是laravel的内部机制了。此处,我们只关心$request和$rules这两个形参就好,都是比较熟悉的。下面尝试用一下吧。
打开ArticleController.php,将store()方法的形参CreateArticleRequest修改为Request,如下:
1 2 3 4 5 6 |
public function store(Request $request){ $this->validate($request,['title'=>'required|min:3','body'=>'required','published_at'=>'required|date']); Article::create($request->all()); return redirect('articles'); } |
之前的CreateArticleRequest是use App\Http\Requests\CreateArticleRequest引入的,而现在的是use Illuminate\Http\Request引入的。
好了,此刻,再在地址栏输入localhost:8888/articles/create,留空提交,依旧可以看到下方的提示信息。
总结
本节主要对一些涉及到需要验证的情况作了一个简单的示范,通过两种方式来进行表单验证。但是还是推荐使用Form Request来进行表单验证,1、毕竟laravel提供了这样的一种方式;2、分离各种功能模块,让专业的人做专业的事,更合理的资源分配。
想获得去掉 5 元限制的证券账户吗?

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。
请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。