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

时间:2015-07-21 04:59:51

标签: php validation laravel laravel-5 laravel-validation

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

我视图中的表单是用HTML编码的,而不是Laravel表单对象,Laravel 5中默认不包含该对象。

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

但是,如果验证通过并且表单已成功通过电子邮件发送,我不希望数据闪烁(即表单应重置)。由于Laravel自动帮助处理重定向,因此我无法在$ this-> validate块中实现此目的。

如果出现验证错误,我怎么能告诉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!');
}

}

3 个答案:

答案 0 :(得分:5)

如果像我这样的人不知道如何获得旧的价值并以某种方式结束,请点击此处:

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

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

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

答案 1 :(得分:1)

只需删除以下代码行:

$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

答案 2 :(得分:0)

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

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