Laravel API路由/api/events返回404,路由列表初始未显示排查
Laravel API路由404问题排查记录
我在开发Laravel API项目时遇到了异常问题:已在routes/api.php中配置EventController及/api/events路由,但访问该路由始终返回404错误。服务器日志显示请求确实命中了路由,但运行php artisan route:list命令最初无法看到这些API路由。
初始配置代码
routes/api.php
<?php use App\Http\Controllers\Api\AttendeeController; use App\Http\Controllers\Api\EventController; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); }); Route::apiResource('events', EventController::class); Route::apiResource('events.attendees', AttendeeController::class) ->scoped(['attendee' => 'event']); Route::get('/test', function () { return response()->json(['message' => 'Test route']); });
app/Http/Controllers/Api/EventController.php
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class EventController extends Controller { public function index() { return response()->json(['message' => 'Events listed successfully']); } public function store(Request $request) { /* ... */ } public function show(string $id) { /* ... */ } public function update(Request $request, string $id) { /* ... */ } public function destroy(string $id) { /* ... */ } }
app/Providers/RouteServiceProvider.php
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Route; class RouteServiceProvider extends ServiceProvider { public function boot() { $this->configureRateLimiting(); $this->routes(function () { Route::prefix('api') ->middleware('api') ->namespace('App\Http\Controllers\Api') ->group(base_path('routes/api.php')); Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); }); } }
问题背景
项目原本缺失api.php和RouteServiceProvider.php文件,我手动创建并完成配置后,预期/api/events能返回EventController中的数据,但实际收到404错误。尝试清理配置缓存、发布vendor文件等操作后,php artisan route:list仍无法显示API路由,这一现象十分反常。
后续调整尝试
我修改了bootstrap/app.php文件,补充API路由的配置逻辑:
bootstrap/app.php
<?php use Illuminate\Foundation\Application; use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Middleware; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', // 处理根("/")路由 commands: __DIR__.'/../routes/console.php', health: '/up' ) ->withRouting( api: __DIR__.'/../routes/api.php', // 处理API路由 apiPrefix: 'api/' // 确保仅API路由使用前缀 ) ->withMiddleware(function (Middleware $middleware) { // 必要时添加中间件 }) ->withExceptions(function (Exceptions $exceptions) { // 必要时添加异常处理 })->create();
修改后运行php artisan route:list,终于能看到API路由,结果如下:
GET|HEAD api/events ....................................................................... events.index › Api\EventController@index POST api/events ....................................................................... events.store › Api\EventController@store GET|HEAD api/events/{event} ................................................................. events.show › Api\EventController@show PUT|PATCH api/events/{event} ............................................................. events.update › Api\EventController@update DELETE api/events/{event} ........................................................... events.destroy › Api\EventController@destroy GET|HEAD api/events/{event}/attendees ........................................ events.attendees.index › Api\AttendeeController@index POST api/events/{event}/attendees ........................................ events.attendees.store › Api\AttendeeController@store GET|HEAD api/events/{event}/attendees/{attendee} ............................... events.attendees.show › Api\AttendeeController@show PUT|PATCH api/events/{event}/attendees/{attendee} ........................... events.attendees.update › Api\AttendeeController@update DELETE api/events/{event}/attendees/{attendee} ......................... events.attendees.destroy › Api\AttendeeController@destroy GET|HEAD api/test .................................................................................................................. GET|HEAD api/user .................................................................................................................. GET|HEAD sanctum/csrf-cookie ..................................... sanctum.csrf-cookie › Laravel\Sanctum › CsrfCookieController@show GET|HEAD storage/{path} .............................................................................................. storage.local
当前遗留问题
尽管路由列表已正常显示/api/events等API路由,但实际访问这些路由时仍返回404错误。
内容的提问来源于stack exchange,提问作者Huda Ala'eddin
相关产品推荐
相关产品推荐

