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
相关产品推荐
相关产品推荐

