
在 Laravel 表单验证失败后重定向时,普通输入框可通过 {{ old('field') }} 自动回填,但 下拉框需为每个 手动添加 selected 属性才能保留旧值,本文详解其原理与标准写法。
在 laravel 表单验证失败后重定向时,普通输入框可通过 `{{ old('field') }}` 自动回填,但 `
在 Laravel 中,old() 辅助函数是表单重填(repopulation)的核心机制,它从 session 的 flash 数据中读取上一次请求提交的值。对于 、
因此,以下写法是无效的:
<select name="country" value="{{ old('country') }}"> <!-- ❌ 错误:select 标签无 value 属性语义 -->
@include('layouts.country-list')
</select>正确做法是:遍历所有
假设你的 country-list.blade.php 包含类似结构:
<option value="US">United States</option> <option value="CA">Canada</option> <option value="GB">United Kingdom</option> <option value="AU">Australia</option>
则应在
<div class="form-group">
<label class="block uppercase text-gray-700 text-xs font-bold">{{ __('Country') }}</label>
<select name="country" id="countrylist" class="form-control js-example-basic-single">
<option value="">{{ __('Select a country') }}</option>
@foreach($countries as $code => $name)
<option value="{{ $code }}" {{ old('country') == $code ? 'selected' : '' }}>
{{ $name }}
</option>
@endforeach
</select>
</div>✅ 关键点:{{ old('country') == $code ? 'selected' : '' }} —— 此内联表达式仅当选项值与旧值完全相等时输出 selected 字符串,浏览器据此高亮对应项。
若你沿用 @include('layouts.country-list'),推荐重构该组件,使其接收 $selected 参数(如 @include('layouts.country-list', ['selected' => old('country')])),并在 country-list.blade.php 中按相同逻辑渲染 selected 属性,以保持复用性与可维护性。
注意事项:
- 使用 ==(非严格比较)通常足够,但若选项值可能为整数或字符串混用(如 '1' vs 1),建议统一类型或改用 ===;
- 若下拉框支持空值(如首项 ),确保 old('country') 为空字符串时也能准确匹配;
- 对于多选下拉框(
- 避免在 old() 中使用未定义键(如 old('nonexistent') 返回 null),建议配合 old('country', 'default_code') 设置默认值提升健壮性。
掌握这一模式后,所有动态下拉框(地区、分类、状态等)均可一致、可靠地实现重填,显著提升表单用户体验与代码专业性。

















