laravel Показать старые данные после неудачной проверки - PullRequest
1 голос
/ 05 ноября 2019

Я пытаюсь обновить сообщение, и для этого у меня есть форма со следующей разметкой

<form method="post" action="{{ admin_url('services/'.$service->id) }}">
    <input name="_method" type="hidden" value="PATCH">

    <div class="form-group">
        <label for="name">Service Name</label>
        <input type="text" class="form-control" id="name" name="name"
            value="{{ old('name') ? old('name') : $service->name }}">
    </div>

    <button type="submit" class="btn btn-primary">Submit</button>
</form>

Первоначально, когда форма открывается, она должна показывать значение модели {{$ service-> name}} и один разФорма отправлена, и если проверка не пройдена, она должна показывать старый ввод

Проблема в том, что если ввод пуст, логика {{ old('name') ? old('name') : $service->name }} оценивается как ложное и вместо пустого значения отображается $service->name.

Код моего контроллера

public function update($id, Request $request)
{
    $validatedData = $request->validate([
        'name' => 'required|max:255|min:5'
    ]);
    $service = Service::find($id);
    $service->name = $request->input('name');
    $service->save();
    return redirect(admin_url('services'))->with('message', 'Service updated successfully');
}

Ответы [ 4 ]

1 голос
/ 07 ноября 2019

Вы можете передать значение по умолчанию функции old , которая будет использоваться, если в сеансе нет значения с таким именем.

Замена

{{ old('name') ? old('name') : $service->name }}

с

{{ old('name', $service->name) }}

Должен решить вашу проблему.


Полный код:

<form method="post" action="{{ admin_url('services/'.$service->id) }}">
    <input name="_method" type="hidden" value="PATCH">

    <div class="form-group">
        <label for="name">Service Name</label>
        <input type="text"
               class="form-control"
               id="name"
               name="name"
               value="{{ old('name', $service->name) }}">
    </div>

    <button type="submit" class="btn btn-primary">Submit</button>
</form>
0 голосов
/ 05 ноября 2019
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
     'name' => 'required|min:2|max:255'
]);

if ($validator->fails()) {
    return redirect()->route('your_route')->withInput(['name'=>$request->name])->withErrors($validator,'validation');
} else {
    return redirect(admin_url('services'))->with('message', 'Service updated successfully');
}
0 голосов
/ 05 ноября 2019

Laravel включает промежуточное ПО для преобразования пустых строк (например, ввода имени) в ноль, и поэтому $service->name всегда отображается

Вы можете удалить / прокомментировать это промежуточное ПО в App\Http\Kernel и показывать только $service->name при начальной загрузке формы

protected $middleware = [
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    // This one down here
    // \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

А затем в разметке

<input type="text" class="form-control" id="name" name="name" value="{{ old('name') ?? $service->name }}">

Надеюсь, это поможет

0 голосов
/ 05 ноября 2019

Вам нужно использовать Validator::make() метод

$validator = Validator::make($request->all(), [
     'name' => 'required|min:2|max:255'
]);

if ($validator->fails()) {
    return Redirect::back()->withErrors($validator)->withInput();
} else {
    return redirect(admin_url('services'))->with('message', 'Service updated successfully');
}
...