如果验证器在 Laravel 5 中失败,您如何刷新请求数据?

How do you flash Request data if a Validator fails in Laravel 5?

我在 Laravel 5 中创建了一个简单的联系表单,使用 Request 对象和 Validator 对象来检查我的输入是否有错误。

我认为表单是在 HTML 中编码的,而不是 Laravel 表单对象,后者默认不包含在 Laravel 5 中。

我需要设置我的表单,以便在验证规则失败时,用户的输入会闪现到会话中,这样它就不会在页面重定向时消失。我可以通过在 POST 控制器中,在验证代码之前放置一个 $request->flash() 来实现这一点。

但是,如果验证通过并且表单已成功通过电子邮件发送,我不希望闪现数据(即,应重置表单)。我没有明显的方法在 $this->validate 块中完成此操作,因为 Laravel 有助于自动处理重定向。

如何告诉 Laravel 只有在出现验证错误时才刷新表单数据?

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class ContactController extends Controller
{
    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        return view('contact');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param Request $request
     * @return Response
     */
    public function store(Request $request)
    {
        // Flash current input in case the validator fails and redirects
        $request->flash();

// Validate the form request, redirect on fail
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|email',
            'subject' => 'required',
            'message' => 'required|min:5',
        ]);

// Generate email from template and send
        \Mail::send('emails.feedback',
            array(
                'name' => $request->get('name'),
                'email' => $request->get('email'),
                'user_message' => $request->get('message'),
                'subject' => $request->get('subject')
            ), function ($message) use ($request) {
                $message->from(\Config::get('site.from_email'));
                $message->to(\Config::get('site.contact_email'), 'Admin');
                $message->subject(\Config::get('site.name') . ': ' . $request->get('subject'));
            });

// Redirect to Contact route with success message
        return \Redirect::route('contact')
            ->with('message', 'Thanks for contacting us!');
    }
}

?>

只需删除以下代码行:

$request->flash();

Laravel 将通过在验证失败时闪烁数据来为您解决这个问题。以下方法在验证失败时被调用:

/**
 * Create the response for when a request fails validation.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  array  $errors
 * @return \Illuminate\Http\Response
 */
protected function buildFailedValidationResponse(Request $request, array $errors)
{
    if ($request->ajax() || $request->wantsJson()) {
        return new JsonResponse($errors, 422);
    }

    return redirect()->to($this->getRedirectUrl())
                    ->withInput($request->input()) // <-- Flashes inputs
                    ->withErrors($errors, $this->errorBag()); // <-- Flashes errors
}

这是您的控制器中用于验证请求的特征,它位于 Illuminate/Foundation/Validation,名称为 ValidatesRequests。检查一下以澄清自己。

或者,如果出于任何原因需要,您可以手动执行此操作,请选中 the documentation

如果有人像我一样不知道如何获取旧值并以某种方式结束在这里,那就是:

<input value="{{ old('var_name') }}">

当 Laravel 为您提供这样的帮助程序时,我认为您不需要访问会话数据。

希望对您有所帮助,祝您有愉快的一天。 =)

要在验证失败时恢复旧值,输入的数据将显示视图

value="{{ (old('title')) ? old('title') : $data->title}}