大多数情况是包名拼错或未指定稳定版本;Laravel路由已内置,无需单独安装,自建项目用illuminate/routing需注意依赖兼容性及PHP版本要求。

composer require 的时候提示找不到包名
大多数情况是包名拼错了,或者没指定稳定版本。Laravel 的路由组件不是独立安装的,laravel/framework 本身已内置 Illuminate/Routing,直接 composer require laravel/framework 就行——但别这么干,它会拉下整个框架,破坏现有项目结构。
真实场景里,你几乎不需要单独装“路由组件”。如果你用的是 Laravel,路由功能开箱即用;如果是自建项目想用 Illuminate Router,得手动引入 illuminate/routing,但它强依赖 illuminate/container、illuminate/http 等一堆包,版本稍不匹配就报错:
Class 'Illuminate\Routing\Router' not found
- 确认 Composer 镜像源没被污染(比如用了过期的国内镜像,漏同步了新 tag)
- 运行
composer show illuminate/routing看是否真安装成功,注意输出里的 version 是否和你的 PHP 版本兼容(例如 v9.x 要求 PHP >=8.0) - 如果只是想快速验证路由逻辑,建议用原生 PSR-7 + FastRoute,比硬啃 Illuminate 依赖链更轻量
Laravel 中 RouteServiceProvider 不生效
常见现象是定义了 routes/web.php 里的路由,但访问 404;或者 php artisan route:list 完全不显示任何路由。根本原因通常是服务提供者没注册或加载时机不对。
- 检查
config/app.php的providers数组里有没有App\Providers\RouteServiceProvider::class - 确认
App\Providers\RouteServiceProvider类中boot()方法调用了$this->routes(),且传入的闭包里正确加载了routes/web.php和routes/api.php - 如果你改过命名空间或类名(比如把
RouteServiceProvider改成WebRouteProvider),记得同时更新app/Providers/AppServiceProvider.php或其他地方对它的引用 - 执行
php artisan config:clear,缓存未刷新会导致旧配置残留
web.php 里用 Closure 路由时 $request 拿不到数据
写成 Route::get('/', function ($request) { ... }) 看似简洁,但 Laravel 默认注入的是 Illuminate\Http\Request 实例,而 Closure 参数绑定依赖反射,一旦你启用了 OPcache 或某些 IDE 优化,参数名可能被压缩,导致注入失败,$request 变成 null 或空对象。
- 永远显式类型提示:
function (Illuminate\Http\Request $request),不要只靠变量名 - 更稳妥的做法是用控制器:
Route::get('/', [HomeController::class, 'index']),由容器自动解析依赖 - 如果坚持用 Closure,确保
APP_DEBUG=true,否则反射失败时不会报错,只会静默跳过 - 注意 Closure 内不能直接用
$request->query()这类方法——得先调$request->query->all(),因为 Laravel 的 Request 是代理对象,部分属性需显式触发
API 路由和 Web 路由混用导致中间件冲突
典型错误是把 auth:sanctum 加到 routes/web.php,结果登录态失效;或者在 routes/api.php 里用 web 中间件(如 encrypt_cookies),引发序列化异常。
-
routes/web.php默认套了web中间件组(含 session、csrf、cookie 加密等),适合带页面交互的请求 -
routes/api.php默认套api组(无 session、无 csrf,走 token 认证),适合前后端分离 - 别手动给 API 路由加
web中间件,也别给 Web 路由加auth:api——它们的 session 存储机制、token 解析方式完全不同 - 需要共享逻辑?抽成独立服务类,而不是共享中间件
路由不是拼积木,中间件栈顺序、请求生命周期阶段、Session 启动时机这些细节一错,调试起来连日志都难定位。尤其在多入口(Web + API + Horizon)共存时,每个路由文件背后的中间件组其实是不同世界。











