spatie/laravel-feed 安装失败需先确认 Laravel 版本:10+用最新版,9.x用^3.7,8.x用^3.5;feed路由须直写web.php、url填相对路径、items需实现指定方法、时间戳须RFC-2822/ISO格式、getFeedId()须为唯一URI。

composer require spatie/laravel-feed 装不上?先确认 Laravel 版本兼容性
spatie/laravel-feed 从 v4.0 开始只支持 Laravel 10.0+,如果你用的是 Laravel 9.x,必须装 v3.7.0;Laravel 8.x 则只能用 v3.5.0。装错版本会直接报 illuminate/support 版本冲突,composer require 卡住或回滚。
- 查当前 Laravel 版本:
php artisan --version - Laravel 10+:运行
composer require spatie/laravel-feed - Laravel 9:显式指定
composer require spatie/laravel-feed:^3.7 - Laravel 8:用
composer require spatie/laravel-feed:^3.5 - 装完别忘执行
php artisan vendor:publish --provider="Spatie\Feed\FeedServiceProvider"
config/feed.php 里 feeds 配置写不对,RSS 根本不生成
这个数组定义了每个 feed 的行为,不是“填个 URL 就完事”。常见错误是把 url 写成绝对路径(比如 https://example.com/feed),但 Laravel 的 url() 辅助函数默认拼的是当前 APP_URL,而 feed 路由实际走的是 Route::feed() 注册的路径 —— 所以 url 应该填相对路径,如 /feed 或 /atom。
-
name是 feed 标题,会被写进标签 -
items必须返回Collection,且每项要有getFeedId()、getFeedTitle()、getFeedDescription()、getFeedUrl()、getFeedUpdated()这些方法(可用 traitHasFeedItems简化) -
format填'rss'或'atom',别写成'RSS'(大小写敏感) - 如果想同时提供两个格式,得配两组,不能在一个数组里混写
Route::feed() 不生效?检查中间件和路由注册时机
Route::feed('/feed', 'news') 这行代码必须放在 routes/web.php 里,且不能包在 Route::middleware() 或 Route::group() 里 —— 它内部自己处理中间件,外部套一层会导致请求被拦截或找不到控制器。
- 不要写成:
Route::middleware('web')->group(...)包着Route::feed() - 确保
App\Providers\RouteServiceProvider中boot()方法调用了$this->routes(),否则web.php不加载 - 访问
/feed返回 404?先跑php artisan route:list | grep feed看有没有注册成功 - 如果用了多语言或子域名路由,
Route::feed()默认不兼容,得手动改源码或换Route::get()+ 自定义响应
生成的 RSS 里时间戳乱码或时区错?别信 Carbon::now()
feed 条目里的 getFeedUpdated() 返回的时间,会被转成 RFC-2822 格式。如果直接用 Carbon::now(),它默认用服务器时区,而 RSS 规范要求带时区偏移(如 Tue, 01 Oct 2024 12:00:00 +0800)。一旦 PHP 时区没设或设错,pubDate 就可能变成 Thu, 01 Jan 1970 00:00:00 +0000 或解析失败。
- 统一用
$model->updated_at->setTimezone('UTC')->rfc2822()(推荐) - 或者在
config/app.php显式设'timezone' => 'UTC',再用$model->updated_at->rfc2822() - 别用
date('r', ...)或strftime(),它们不保证 RFC-2822 兼容性 - Atom 格式对时间更严格,必须是 ISO 8601,用
$model->updated_at->toISOString()
最常被跳过的其实是 getFeedId() —— 它不是随便返回个 ID 字符串就行,必须是全局唯一且不变的 URI(比如 https://example.com/posts/123),否则聚合器会当成新条目反复推送。别图省事用 $model->id。











