💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## lumen 表单验证 #### 创建控制器 接下来,让我们来看下操作这些路由的控制器。我们先让`store`方法空着: ~~~php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class PostController extends Controller { /** * 显示创建博客文章的表单。 * * @return Response */ public function create() { return view('post.create'); } /** * 保存一个新的博客文章。 * * @param Request $request * @return Response */ public function store(Request $request) { // 验证以及保存博客发表文章... } } ~~~ #### 在控制器中编写验证逻辑 我们会使用了`ValidatesRequests``trait`类。这个 `trait` 在你所有的控制器里提供了方便的`validate`验证方法。 `validate`方法会接收 HTTP 传入的请求以及验证的规则。如果验证通过,你的代码就可以正常的运行。若验证失败,则会抛出异常错误消息并自动将其返回给用户。在一般的 HTTP 请求下,都会生成一个重定向响应,对于 AJAX 请求则会发送 JSON 响应。 让我们接着回到`store`方法来深入理解`validate`方法: ~~~php /** * 保存一篇新的博客文章。 * * @param Request $request * @return Response */ public function store(Request $request) { $this->validate($request, [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]); // 博客文章成功发表,将其保存到数据库... } ~~~ * 如果验证失败,将会自动生成一个对应的响应 * 如果验证通过,那我们的控制器将会继续正常运行 * 如果是跨域请求,也是直接返回错误 #### 显示验证错误 * Laravel 会自动检查 session 内的错误数据,如果错误存在的话,它会自动将这些错误消息绑定到视图上。 * 错误信息`$errors`变量在每次请求的所有视图中都可以被使用 * `$errors`变量是`Illuminate\Support\MessageBag`的实例。 * 如果是跨域等请求,可以也读取 错误信息`$errors` 所以,在我们的例子中,当验证失败时,用户将被重定向到我们的控制器`create`方法,让我们在视图中显示错误的消息: ~~~php <!-- /resources/views/post/create.blade.php --> <h1>创建文章</h1> @if (count($errors) > 0) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <!-- 创建文章的表单 --> ~~~ ### 手动创建验证程序 如果你不想要使用`ValidatesRequests`trait 的`validate`方法,你可以手动创建一个 validator 实例并通过`Validator::make`方法在[facade](https://learnku.com/docs/laravel/5.1/facades)生成一个新的 validator 实例: ~~~php <?php namespace App\Http\Controllers; use Validator; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class PostController extends Controller { /** * 保存一篇新的博客文章。 * * @param Request $request * @return Response */ 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) ->withInput(); } // 保存文章... } } ~~~ 第一个传给`make`方法的参数是验证数据。第二个参数则是数据的验证规则。 如果请求没有通过验证,则可以使用`withErrors`方法把错误消息闪存到 session。在进行重定向之后,`$errors`变量可以在视图中自动共用,让你可以轻松地显示这些消息并返回给用户。`withErrors`方法接收 validator、`MessageBag`,或 PHP`array`。 #### 命名错误清单 假如在一个页面中有许多表单,你可能希望为`MessageBag`的错误命名,这可以让你获取特定表单的所有错误消息。只需在`withErrors`的第二个参数设置名称即可: ~~~php return redirect('register') ->withErrors($validator, 'login'); ~~~ 然后你就可以从一个`$errors`变量中,获取已命名的`MessageBag`实例: ~~~php {{ $errors->login->first('email') }} ~~~ #### 验证后的挂勾 在验证完成之后,validator 可以让你附加返回消息。你可以更简单的做进一步的验证以及增加更多的错误消息到消息集合上。在 validator 实例使用`after`方法如下所示: ~~~php $validator = Validator::make(...); $validator->after(function($validator) { if ($this->somethingElseIsInvalid()) { $validator->errors()->add('field', 'Something is wrong with this field!'); } }); if ($validator->fails()) { // } ~~~ ## 处理错误消息 调用一个`Validator`实例的`errors`方法,会得到一个`Illuminate\Support\MessageBag`的实例,里面有许多可让你操作错误消息的便利方法。 #### 查看特定字段的第一个错误消息 如果要查看特定字段的第一个错误消息,可以使用`first`方法: ~~~php $messages = $validator->errors(); echo $messages->first('email'); ~~~ #### 查看特定字段的所有错误消息 如果你想通过指定字段来简单的获取所有消息中的一个数组,则可以使用`get`方法: ~~~php foreach ($messages->get('email') as $message) { // } ~~~ #### 查看所有字段的所有错误消息 如果你想要得到所有字段的消息数组,则可以使用`all`方法: ~~~php foreach ($messages->all() as $message) { // } ~~~ #### 判断特定字段是否含有错误消息 ~~~php if ($messages->has('email')) { // } ~~~ #### 获取格式化后的错误消息 ~~~php echo $messages->first('email', '<p>:message</p>'); ~~~ #### 获取所有格式化后的错误消息 ~~~php foreach ($messages->all('<li>:message</li>') as $message) { // } ~~~ ### 自定义错误消息 如果有需要的话,你也可以自定义错误的验证消息来取代默认的验证消息。有几种方法可以来自定义指定的消息。首先,你需要先通过传递三个参数到`Validator::make`方法来自定义验证消息: ~~~php $messages = [ 'required' => 'The :attribute field is required.', ]; $validator = Validator::make($input, $rules, $messages); ~~~ 在这个例子中,`:attribute`占位符会被通过验证的字段实际名称所取代。除此之外,你还可以使用其它默认字段的验证消息。例如: ~~~php $messages = [ 'same' => 'The :attribute and :other must match.', 'size' => 'The :attribute must be exactly :size.', 'between' => 'The :attribute must be between :min - :max.', 'in' => 'The :attribute must be one of the following types: :values', ]; ~~~ #### 指定自定义消息到特定的属性 有时候你可能想要对特定的字段来自定义错误消息。只需在属性名称后加上「.」符号和指定验证的规则即可: ~~~php $messages = [ 'email.required' => 'We need to know your e-mail address!', ]; ~~~ #### 在语言包中自定义指定消息 在许多情况下,你可能希望在语言包中被指定的特定属性自定义消息不被直接传到`Validator`上。因此你可以把消息加入到`resources/lang/xx/validation.php`语言包中的`custom`数组。 ~~~php 'custom' => [ 'email' => [ 'required' => 'We need to know your e-mail address!', ], ], ~~~