You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10中Route::Resource正常,新增同控制器路由报show方法不存在

问题描述

在Laravel 10项目中,我在PinjamController里创建了两个独立方法(index和all)分别获取全部数据和特定条件数据。注册、登录路由及所有资源路由均正常工作,但新增同控制器的额外路由时出现问题:

  • 访问{{ route('pinjam.all') }}时出现404错误
  • 访问{{ url('/admin/pinjam/all')}}时触发BadMethodCallException,提示App\Http\Controllers\PinjamController::show方法不存在

相关代码

视图链接代码

<!-- 正常工作 -->
<a class="btn btn-success" href="{{ route('pinjam.index') }}"> Index Pinjam</a>
<!-- 404错误 -->
<a class="btn btn-primary" href="{{ route('pinjam.all')}}"> Record Peminjaman</a>
<!-- BadMethodCallException错误 -->
<a class="btn btn-primary" href="{{ url('/admin/pinjam/all')}}"> Record Peminjaman</a>

web.php路由配置

use App\Http\Controllers\PinjamController;
Route::resource('/admin/pinjam',PinjamController::class)->middleware('auth:admin');
Route::get('/admin/pinjam/all',[PinjamController::class,'all'])->middleware('auth:admin');
Route::get('/admin/pinjam/kembali',[PinjamController::class,'kembali'])->middleware('auth:admin');
Route::post('/admin/pinjam/track',[PinjamController::class,'track'])->middleware('auth:admin');

PinjamController.php相关代码

use Illuminate\Http\Request;
use App\Providers\RouteServiceProvider;
use App\Models\bukus_users;

protected function all()
{
    $rows = bukus_users::query()->with(['buku', 'user'])->paginate(5)->toArray();
    return view('admin.pinjam.all', ['rows' => $rows]);
}

protected function kembali()
{
    return view('admin.kategori.kembali');
}

protected function track(Request $request)
{
    $pinjam = bukus_user::where('barcode','like','%' . request('barcode') . '%')->first();
    $pinjam->status_pengembalian = false;
    $pinjam->save();
    return redirect()->route('pinjam.index')->with('success','Buku Telah dikembalikan');
}

protected function index()
{
    $rows = bukus_users::query()->with(['buku', 'user'])->paginate(5)->toArray();
    return view('admin.pinjam.index', ['rows' => $rows]);
}

问题原因及解决方案

1. 路由匹配顺序错误

Laravel路由按从上到下顺序匹配,Route::resource会生成/admin/pinjam/{pinjam}的show方法路由。当自定义路由/admin/pinjam/all放在资源路由后面时,Laravel会把all识别为show方法的参数,尝试调用不存在的show方法,从而抛出错误。

解决方法:将自定义路由放在资源路由之前:

use App\Http\Controllers\PinjamController;
// 先定义自定义路由
Route::get('/admin/pinjam/all',[PinjamController::class,'all'])->middleware('auth:admin')->name('pinjam.all');
Route::get('/admin/pinjam/kembali',[PinjamController::class,'kembali'])->middleware('auth:admin')->name('pinjam.kembali');
Route::post('/admin/pinjam/track',[PinjamController::class,'track'])->middleware('auth:admin')->name('pinjam.track');
// 再定义资源路由
Route::resource('/admin/pinjam',PinjamController::class)->middleware('auth:admin');

2. 控制器方法访问权限错误

all()、kembali()、track()、index()方法使用protected修饰,Laravel路由无法调用受保护的方法,必须改为public。

解决方法:修改方法修饰符为public,同时修正track方法中的模型类名错误(bukus_user改为bukus_users):

public function all()
{
    $rows = bukus_users::query()->with(['buku', 'user'])->paginate(5)->toArray();
    return view('admin.pinjam.all', ['rows' => $rows]);
}

public function kembali()
{
    return view('admin.kategori.kembali');
}

public function track(Request $request)
{
    $pinjam = bukus_users::where('barcode','like','%' . request('barcode') . '%')->first();
    $pinjam->status_pengembalian = false;
    $pinjam->save();
    return redirect()->route('pinjam.index')->with('success','Buku Telah dikembalikan');
}

public function index()
{
    $rows = bukus_users::query()->with(['buku', 'user'])->paginate(5)->toArray();
    return view('admin.pinjam.index', ['rows' => $rows]);
}

3. 自定义路由未命名

route('pinjam.all')报错404是因为未给自定义路由命名,Laravel无法找到对应的路由名称。

解决方法:在自定义路由后添加->name('pinjam.all'),如上述路由代码所示,即可正常使用route('pinjam.all')生成URL。


内容的提问来源于stack exchange,提问作者Kholid Syaifullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:14:59