Laravel项目中green路由生成链接时缺失必填参数的问题排查与解决
Laravel项目中green路由生成链接时缺失必填参数的问题排查与解决
嗨,我来帮你捋一捋这个问题的根源和解决办法~
首先咱们来分析报错的原因:你在视图里用了@for ($i = 0; $i < $red->count(); $i++)这个循环,循环次数是按照$red集合的数量(10条)来定的,但你在控制器里只给$green取了5条数据。当循环到i >=5的时候,$green->slice($i, 1)->first()就会返回null,对应的slug自然也就不存在了,这时候调用route('green', ...)就会因为缺少必填的green参数抛出错误。
另外还有两个小细节需要先修正:
- 你的HomeController里数组赋值语法错了,应该用
=>而不是=,否则数据根本传不到视图里; - 视图里的
<a>标签没有闭合,而且缺少链接文本,这也会导致链接无法正常显示。
接下来给你几个针对性的解决方案:
方案一:分开循环展示(推荐)
如果你的需求是分别展示red和green的内容,没必要强行放在同一个循环里,用@foreach遍历集合更简洁安全,还能避免索引越界:
先修正控制器代码
class HomeController extends Controller { public function index() { return view('home', [ 'red' => PostRed::limit(10)->orderBy('id', 'desc')->get(), // 把=改成=> 'red_images' => PostRedImage::limit(2)->get(), 'green' => PostGreen::limit(5)->orderBy('id', 'desc')->get(), // 把=改成=> ]); } }
再修改视图循环逻辑
{{-- 单独循环展示red的内容 --}} @foreach($red as $redItem) <div> <a href="{{ route('red', $redItem->slug) }}">{{ $redItem->title }}</a> <!-- 补充链接文本,闭合标签 --> </div> @endforeach {{-- 单独循环展示green的内容 --}} @foreach($green as $greenItem) <div> <a href="{{ route('green', $greenItem->slug) }}">{{ $greenItem->title }}</a> <!-- 补充链接文本,闭合标签 --> </div> @endforeach
方案二:按最少数量循环(如果需要对应位置展示)
如果确实要在同一个循环里同时展示red和green的对应项,那循环次数应该以两个集合中数量更少的那个为上限:
@php // 取两个集合中数量较小的值作为循环上限 $maxLoopCount = min($red->count(), $green->count()); @endphp @for ($i = 0; $i < $maxLoopCount; $i++) <div> <a href="{{ route('red', $red[$i]->slug) }}">{{ $red[$i]->title }}</a> </div> <div> <a href="{{ route('green', $green[$i]->slug) }}">{{ $green[$i]->title }}</a> </div> @endfor
这样就能保证循环过程中$green[$i]始终存在,不会出现参数缺失的问题。
备注:内容来源于stack exchange,提问作者Itamar Campos
相关产品推荐
相关产品推荐

