Laravel 10报错:resto.show路由缺少必填参数
Laravel食品菜单详情页跳转错误排查与解决
错误信息
Missing required parameters for [Route: resto.show] [URI: resto/{resto}]. (View: /vagrant/site/resources/views/resto/index.blade.php)
控制器代码(FoodController)
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Food; use Illuminate\Support\Composer; class FoodController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { return view('resto.index' , [ 'foods' => Food::all() ]); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { return view('resto.create'); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $request->validate([ 'food_name' => 'required ' , 'food_price' => 'required' ]); $food = new Food(); $food->name = strip_tags($request->input('food_name')); $food->price = strip_tags($request->input('food_price')); $food->save(); return redirect()->route('resto.index'); } public function show($id) { return view('resto.show' , [ 'food' => Food::find($id) ]); } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } }
路由配置(web.php)
Route::get('/' , [PageController::class , 'index']) ->name('home.index'); Route::get('about' , [PageController::class , 'about']) ->name('home.about'); Route::get('contact' , [PageController::class , 'contact']) ->name('home.contact'); Route::resource('resto' , 'FoodController');
Blade视图文件
index.blade.php
@extends('layout') @section('title', 'Computers') @section('section') <div class="title m-b-md"> Computers Page </div> <div class="mt-5"> @if(count($computers) > 0) <ul> @foreach($computers as $computer) <a href="{{ route('computers.show' , ['computer' => $computer['id']]) }}"> <li>{{ $computer['name'] }} = {{ $computer['ram'] }} </li> </a> @endforeach </ul> @else <h3>No Computers</h3> @endif </div> @endsection
show.blade.php
@extends('main') @section('title', 'Food page') <style> li:hover { text-decoration: underline; cursor: pointer; } </style> @section('section') <div class="title m-b-md"> Laravel </div> <p>{{ $food['name'] }}</p> @endsection
问题分析与解决步骤
错误根源在于resto/index.blade.php的内容完全和食品菜单业务不匹配,存在以下几个问题:
- 控制器传递的变量是
$foods,但视图里使用的是$computers,无法正常遍历食品数据 - 视图里调用的是
computers.show路由,而实际配置的资源路由是resto.show,参数名也对应错误 - 视图内的标题、展示字段(如
ram)都和食品业务无关
修正后的index.blade.php代码
@extends('layout') @section('title', '食品菜单') @section('section') <div class="title m-b-md"> 食品菜单页面 </div> <div class="mt-5"> @if(count($foods) > 0) <ul> @foreach($foods as $food) <a href="{{ route('resto.show' , ['resto' => $food->id]) }}"> <li>{{ $food->name }} - ¥{{ $food->price }}</li> </a> @endforeach </ul> @else <h3>暂无食品</h3> @endif </div> @endsection
额外优化建议
- 控制器
show方法中,建议用findOrFail()替代find(),当ID不存在时会返回标准404页面,更符合Laravel最佳实践:public function show($id) { return view('resto.show' , [ 'food' => Food::findOrFail($id) ]); } - 统一视图布局文件:
index.blade.php使用layout,show.blade.php使用main,建议保持一致避免布局混乱
内容的提问来源于stack exchange,提问作者Abdulrahman
相关产品推荐
相关产品推荐

