
在 Laravel Blade 模板中,若在 @foreach 循环内部重复声明 $counter = 1,会导致每次迭代都重置计数器,无法实现连续递增;正确做法是将计数器初始化移至循环外部,并在循环体内递增。
在 laravel blade 模板中,若在 `@foreach` 循环内部重复声明 `$counter = 1`,会导致每次迭代都重置计数器,无法实现连续递增;正确做法是将计数器初始化移至循环外部,并在循环体内递增。
Blade 模板中的 PHP 变量作用域遵循 PHP 基本规则:每次进入 @foreach 循环体时,都会重新执行其中的 @php 块。因此,原代码中:
@foreach($niloufars as $niloufar)
@php
$counter = 1; // ❌ 每次循环都重置为 1!
@endphp
// ... 表单字段使用 {{ $counter }}
@php
$counter = $counter + 1; // ✅ 但此时已晚——下一轮又重置了
@endphp
@endforeach导致所有表单项的 name 属性均为 niloufar_name_1 和 niloufar_link_1。
✅ 正确写法:将计数器初始化放在 @foreach 外部,并在循环内递增:
@php
$counter = 1;
@endphp
<div id="dynamic_field">
@foreach($niloufars as $niloufar)
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="niloufar_name_{{ $counter }}">Title</label>
<input type="text"
class="form-control"
name="niloufar_name_{{ $counter }}"
value="{{ old('niloufar_name_'.$counter, $niloufar->name) }}">
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="niloufar_link_{{ $counter }}">Link</label>
<input type="text"
class="form-control"
name="niloufar_link_{{ $counter }}"
value="{{ old('niloufar_link_'.$counter, $niloufar->link) }}">
</div>
</div>
</div>
@php
$counter++; // ✅ 在循环末尾递增
@endphp
@endforeach
</div>? 更优雅的替代方案:直接使用 Blade 的 $loop 变量(Laravel 5.3+ 支持),无需手动管理计数器:
<div id="dynamic_field">
@foreach($niloufars as $niloufar)
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="niloufar_name_{{ $loop->iteration }}">Title</label>
<input type="text"
class="form-control"
name="niloufar_name_{{ $loop->iteration }}"
value="{{ old('niloufar_name_'.$loop->iteration, $niloufar->name) }}">
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="niloufar_link_{{ $loop->iteration }}">Link</label>
<input type="text"
class="form-control"
name="niloufar_link_{{ $loop->iteration }}"
value="{{ old('niloufar_link_'.$loop->iteration, $niloufar->link) }}">
</div>
</div>
</div>
@endforeach
</div>⚠️ 注意事项:
- $loop->iteration 从 1 开始(对应第 1 次迭代),而 $loop->index 从 0 开始,需根据命名习惯选择;
- 使用 old() 辅助函数可确保表单验证失败后保留用户输入,提升体验;
- 避免在循环内重复定义同名变量,尤其涉及状态维护时,应严格遵循“初始化→使用→更新”逻辑顺序。
综上,手动计数器需确保作用域正确,而优先推荐使用 $loop 对象——它更安全、语义清晰且无需额外 PHP 逻辑。

















