📜  如何在旧值中设置条件值或使用验证编辑新值无法在 laravel 中重定向回 - PHP (1)

📅  最后修改于: 2023-12-03 15:24:38.914000             🧑  作者: Mango

如何在旧值中设置条件值或使用验证编辑新值无法在 Laravel 中重定向回

在 Laravel 中,我们经常需要在表单验证失败时,将错误信息返回给前端,并且保留用户已经填写的表单内容。在某些情况下,我们可能想要在这个基础上再做一些额外的处理,比如在旧值中设置条件值,或者使用验证编辑新值。

以下是实现以上需求的一些方法。

在旧值中设置条件值

在表单验证失败后,Laravel 会自动将用户填写的表单内容保存在 old() 中。这个方法会返回一个关联数组,数组的键为表单元素的 name 属性,值为用户填写的表单值。我们可以在这个数组中添加一些条件字段,然后将其返回给前端。

在控制器中,我们可以使用 withInput() 方法将旧值保存在闪存中,然后使用 withErrors() 方法将验证错误信息存入闪存。最后使用 redirect() 方法将用户重定向回之前的页面,并在视图中读取闪存数据,以显示错误信息和保留用户已经填写的表单内容。

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8|confirmed',
    ]);

    if ($validator->fails()) {
        return redirect()
            ->back()
            ->withInput(['condition' => 'value'])
            ->withErrors($validator);
    }

    // ...
}

在视图中,我们可以使用 old() 方法读取旧值中的数据,并为其添加一些条件值。在下面的例子中,我们为 name 字段设置了一个条件值,如果 name 字段为空则使用默认值。

<form method="POST" action="/example">
    @csrf
    <div>
        <label for="name">Name</label>
        <input type="text" name="name" value="{{ old('name', 'default') }}">
    </div>
    <div>
        <label for="email">Email</label>
        <input type="email" name="email" value="{{ old('email') }}">
    </div>
    <div>
        <label for="password">Password</label>
        <input type="password" name="password">
    </div>
    <div>
        <label for="password_confirmation">Confirm Password</label>
        <input type="password" name="password_confirmation">
    </div>
    <button type="submit">Submit</button>
</form>
使用验证编辑新值

在某些情况下,我们可能需要在验证失败后,将表单中的值重新编辑并保存,让用户修正错误后再次提交表单。为了达到这个目的,我们可以使用 old() 方法和表单的 value 属性,将编辑后的值回显到表单中。

在控制器中,我们可以使用 Validatorafter() 方法,在表单验证之后回调一个自定义函数。在这个函数中,我们可以获得 $validator 对象和请求 $request 对象,然后使用它们来编辑表单的值。

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8|confirmed',
    ]);

    $validator->after(function ($validator) use ($request) {
        $validator->setData(['name' => strtoupper($request->input('name'))]);
    });

    if ($validator->fails()) {
        return redirect()
            ->back()
            ->withErrors($validator)
            ->withInput();
    }

    // ...
}

在视图中,我们可以使用表单的 value 属性和 old() 方法来回显表单的值。在以下例子中,我们将会将 name 字段的值全部转为大写,并在表单中回显。

<form method="POST" action="/example">
    @csrf
    <div>
        <label for="name">Name</label>
        <input type="text" name="name" value="{{ old('name', strtoupper($request->input('name'))) }}">
    </div>
    <div>
        <label for="email">Email</label>
        <input type="email" name="email" value="{{ old('email') }}">
    </div>
    <div>
        <label for="password">Password</label>
        <input type="password" name="password">
    </div>
    <div>
        <label for="password_confirmation">Confirm Password</label>
        <input type="password" name="password_confirmation">
    </div>
    <button type="submit">Submit</button>
</form>

以上就是如何在旧值中设置条件值或使用验证编辑新值无法在 Laravel 中重定向回的介绍。希望对您有所帮助!