Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Feed Render Bundle Laravel Package

tamago/feed-render-bundle

tamago/feed-render-bundle is a Symfony bundle for rendering RSS and Atom feeds from application data. It simplifies feed generation, template customization, and integration, letting you expose structured content to readers and aggregators with minimal setup.

View on GitHub
Deep Wiki
Context7

Getting Started

First, the framework reality check. Despite the "Laravel developer" framing, tamago/feed-render-bundle is a Symfony bundle, not a Laravel package. It has no ServiceProvider, no config/feed-render.php, no php artisan vendor:publish tag, and Composer auto-discovery will not register it. If your application is Laravel, you cannot composer require this and expect it to work — see Implementation Patterns for the realistic options.

  1. Read the source before installing. The package has zero stars, zero dependents, and no score. It is unvetted. Fortunately a "simple bundle to render RSS feeds" is small — read src/, Resources/config/, and the README in full (30–60 minutes) before it touches a production composer.json.
  2. Pin the version exactly ("tamago/feed-render-bundle": "x.y.z") and commit the lock file. With no dependents, there is no downstream signal that a release is broken.
  3. In a Symfony app, register it in config/bundles.php:
    Tamago\FeedRenderBundle\TamagoFeedRenderBundle::class => ['all' => true],
    
    Then check whether the bundle ships routing (Resources/config/routing.xml|yaml) that you must import in config/routes.yaml, or whether it only exposes services you wire yourself.
  4. Where to look first, in order: the bundle class (does it implement Bundle only, or ExtensionInterface?), DependencyInjection/Configuration.php (what is configurable), DependencyInjection/*Extension.php (service IDs and aliases), then any Controller/ or Renderer service.
  5. First use case: a single public route — /feed.xml or /rss/{channel} — that returns a valid RSS 2.0 document with Content-Type: application/rss+xml; charset=UTF-8. Get one hard-coded item rendering end-to-end, validate it, then wire real data.

Implementation Patterns

If you are genuinely on Symfony (the intended path):

  • Controller-driven rendering. Inject the bundle's renderer service into your own controller and return a Response with the RSS content type rather than letting the bundle own the route. This keeps auth, tenancy, and query scoping in your code, not in a third-party controller.
  • Template override. Most small feed bundles delegate to a Twig template. Override it via bundle inheritance (templates/bundles/TamagoFeedRenderBundle/...) so upstream upgrades don't clobber your markup.
  • Service decoration. If the renderer is a concrete class with a sane interface, decorates: it to add caching or item filtering without forking.

If you are on Laravel (the realistic path for this assessment):

  • Do not install it. The DI wiring, Bundle class, and Resources/config conventions have no meaning to Laravel's container. Bridging means manually instantiating services the bundle expects Symfony to build — brittle and pointless for a package this small.
  • Reimplement the intent in ~40 lines. A route, a query, and a Blade view is the whole feature:
    Route::get('/feed.xml', function () {
        $posts = Post::published()->latest('published_at')->limit(50)->get();
        return response()
            ->view('feeds.rss', ['posts' => $posts])
            ->header('Content-Type', 'application/rss+xml; charset=UTF-8');
    });
    
  • Or use a maintained Laravel equivalent (spatie/laravel-feed) which gives you auto-discovery <link rel="alternate"> tags, multiple feeds, and cache-aware responses — all things you would otherwise rebuild.
  • Treat this repo as a reference implementation, not a dependency: read how it structures the XML, then write idiomatic Laravel.

Workflow tip common to both: feeds are polled aggressively by readers (often every 15–60 minutes per subscriber). Put generation behind HTTP caching — Cache-Control, ETag, Last-Modified, and a 304 short-circuit — or a queue-populated cache key. A feed endpoint that runs an unbounded query is a self-inflicted DoS.

Gotchas and Tips

  • Zero dependents is a warning, not a detail. No one has hit the edge cases for you. Assume the README is incomplete and the source is the spec.
  • Drafts and private content leak easily. Feeds are unauthenticated by nature. Scope every query explicitly (->where('status', 'published')) and never reuse an admin listing query.
  • Absolute URLs only. link, guid, and image URLs must be fully qualified with scheme and host. Relative paths silently break in most readers and are the single most common feed bug.
  • Date formats differ by spec. RSS 2.0 wants RFC 2822 (D, d M Y H:i:s O, i.e. date(DATE_RSS)); Atom wants RFC 3339 (date(DATE_ATOM)). Mixing them produces feeds that validate "almost."
  • Sanitize before escaping. User content can contain control characters (\x00–\x1F) that are illegal in XML 1.0 and will make the document unparseable. Strip them, then escape; don't rely on htmlspecialchars alone. Titles with & and descriptions with embedded HTML are the usual suspects — prefer <![CDATA[ ]]> for description bodies.
  • UTF-8 without BOM. A stray BOM before <?xml breaks parsers nondeterministically across readers.
  • Validate, don't eyeball. Run output through the W3C Feed Validator; browsers render broken feeds forgivingly and hide the problem until a subscriber complains.
  • Debugging in Symfony: bin/console debug:router | grep -i feed to find the actual path, and bin/console debug:container | grep -i feed to discover the real service IDs when the README's names don't match.
  • Extension points are limited by design. Expect at most: configuration values, a template to override, and maybe a renderer service to decorate. If you need per-item custom namespaces or Atom+RSS duality, budget for a fork — and given the size, vendoring a copy into app/ is often cleaner than carrying an abandoned dependency.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core