Laravel Blade排除当前Locale后设置首个显示项为active的问题
解决Blade语言标签active类失效问题
直接在循环前处理语言数组,过滤掉当前Locale并重置索引,就能让$loop->first准确命中第一个要显示的标签,完美解决active类丢失的问题,而且完全适配后续从配置动态获取的语言列表。
具体实现
方法一:Blade内直接处理(快速实现)
@php // 替换成从config获取的语言数组,比如 config('app.supported_locales') $allLocales = ['ca','en','es','nl']; // 过滤掉当前使用的语言 $displayLocales = array_filter($allLocales, fn($lang) => $lang !== app()->getLocale()); // 重置数组索引,保证$loop->first能正确识别第一个元素 $displayLocales = array_values($displayLocales); @endphp @foreach($displayLocales as $lang) <li> <a href="#{{ $lang }}" class="@if($loop->first) active @endif"> {{ strtoupper($lang) }} <!-- 可按需替换为语言名称,比如 __('lang.'.$lang) --> </a> </li> @endforeach
方法二:控制器提前处理(更优雅)
如果不想在视图里写过多PHP逻辑,可在控制器中先处理好要展示的语言数组,再传递到视图:
// 控制器代码示例 public function edit() { $allLocales = config('app.supported_locales'); $displayLocales = array_values(array_filter($allLocales, function($lang) { return $lang !== app()->getLocale(); })); return view('your-form-view', compact('displayLocales')); }
视图里直接循环即可:
@foreach($displayLocales as $lang) <li> <a href="#{{ $lang }}" class="@if($loop->first) active @endif"> {{ strtoupper($lang) }} </a> </li> @endforeach
方案优势
- 彻底规避原循环中跳过元素导致
$loop->first失效的问题,逻辑更可靠 - 完全不依赖硬编码的语言值,不管配置里的语言列表顺序、数量怎么变,都能正常工作
- 代码简洁,没有冗余的if else判断
内容的提问来源于stack exchange,提问作者Hardist
相关产品推荐
相关产品推荐

