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.
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.
src/, Resources/config/, and the README in full (30–60 minutes) before it touches a production composer.json."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.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.Bundle only, or ExtensionInterface?), DependencyInjection/Configuration.php (what is configurable), DependencyInjection/*Extension.php (service IDs and aliases), then any Controller/ or Renderer service./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.If you are genuinely on Symfony (the intended path):
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.templates/bundles/TamagoFeedRenderBundle/...) so upstream upgrades don't clobber your markup.decorates: it to add caching or item filtering without forking.If you are on Laravel (the realistic path for this assessment):
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.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');
});
spatie/laravel-feed) which gives you auto-discovery <link rel="alternate"> tags, multiple feeds, and cache-aware responses — all things you would otherwise rebuild.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.
->where('status', 'published')) and never reuse an admin listing query.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.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."\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.<?xml breaks parsers nondeterministically across readers.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.app/ is often cleaner than carrying an abandoned dependency.How can I help you explore Laravel packages today?