willvincent/feeds
Laravel package for reading and creating RSS and Atom feeds with a simple, expressive API. Parse external feeds into structured items or generate your own from arrays, models, and custom views, with caching and Laravel integration built in.
Architecture fit. willvincent/feeds is a thin Laravel service provider that binds the SimplePie RSS/Atom parser into the container and exposes it behind a facade. It is an ingestion-only utility: it reads and parses outbound feeds, it does not generate them. Architecturally it is non-invasive — it adds a binding, an optional config file, and a facade — so it does not constrain application layering. The natural fit is a Laravel app that needs to pull third-party feeds (news, blogs, podcasts, release notes) on a schedule. It is a poor fit if you need feed generation, JSON Feed, or a parser you intend to heavily customize; in those cases a direct SimplePie or laminas/laminas-feed integration gives the same result without the wrapper.
Integration feasibility. Very high. composer require willvincent/feeds, Laravel package auto-discovery registers the provider and facade, optional vendor:publish for config. Typical usage is 2–5 lines to fetch and iterate items. There is no schema change, no middleware, no queue requirement. The realistic effort for a first working integration is under a day for a Laravel-fluent engineer.
Technical risk. Concentrated in three areas, not in the wrapper itself:
Secondary risks: feed parsing is synchronous and IO-bound, so it must not sit in a request path; caching behavior is config-driven and easy to misconfigure; encoding/charset handling for non-UTF-8 feeds is a known source of garbage output.
Key questions.
FeedItem shape) rather than SimplePie objects leaking into domain code?Stack fit. Strong for a conventional Laravel monolith or modular monolith on PHP 8.1+. It leans on Laravel's container, config, and cache, so it behaves predictably in that environment. It has no first-class queue, event, or HTTP-client integration — scheduling and retries are yours to build with the scheduler and queue. In a non-Laravel or multi-framework codebase, use SimplePie directly; the wrapper adds nothing there.
Migration path. Adoption is additive and reversible, which is the main argument for it. The recommended pattern is to hide the facade behind a small internal interface (e.g. FeedReader::fetch(string $url): FeedCollection) implemented by an adapter over this package. That keeps SimplePie types out of domain code and makes a later swap to another parser a one-class change. If a bespoke parser or laminas/laminas-feed already exists and works, migration is not justified by this package — the gain is convenience, not capability.
Compatibility. Verify the composer constraints against the target Laravel and PHP versions rather than trusting the 2025 release date; wrapper packages frequently lag major framework releases. Check that the pinned SimplePie version is PHP 8.3/8.4-clean, and confirm the cache store you intend to use is one SimplePie's caching layer handles (file and Laravel cache are the usual paths). Validate behavior on at least one malformed, one non-UTF-8, and one large feed before committing.
Sequencing.
FeedReader interface and adapter; keep the facade at the boundary.Maintenance. The wrapper itself is small and stable, so direct maintenance is low. The real maintenance burden is the transitive SimplePie dependency: PHP upgrade friction, security advisories, and upstream stalls that you cannot fix without forking or replacing. Budget for an annual dependency review and a documented escape hatch (the adapter interface above).
Support. Community-supported, MIT, single-maintainer risk typical of small Laravel packages. There is no vendor SLA. Troubleshooting often means reading SimplePie documentation and source rather than the wrapper's, so internal knowledge should be documented rather than assumed.
Scaling. Parsing is CPU-light and IO-heavy. Scale by increasing worker concurrency for fetch jobs, not by adding app servers. The dominant cost is outbound HTTP and memory for large feed payloads; cap feed size, cap item count retained, and enforce timeouts. Cache aggressively and per-feed — most feeds do not change more than hourly, and aggressive default polling is the most common self-inflicted scaling problem. Watch for cache stampedes on popular feeds; stagger schedules and use locks.
Failure modes. Expect and design for: connection timeouts and DNS failures; HTTP 429/403 from feed hosts that dislike frequent polling; malformed or truncated XML causing parse exceptions; non-UTF-8 charsets producing mojibake; oversized payloads causing memory spikes; silent schema drift in third-party feeds; and SSRF if URLs are user-controlled. Each should degrade to "last known good cached items" rather than an error page — that is the single most important resilience decision.
Ramp-up. A Laravel developer is productive in a few hours. The learning curve is in SimplePie's object model (items, enclosures, namespaces, date normalization) and in cache/timeout tuning, not in the package. Plan half a day of onboarding plus a short internal note on sanitization and allowlisting so the next engineer does not rediscover the security posture.
How can I help you explore Laravel packages today?