Install the Bundle
composer require argentum/feed-bundle
Enable in config/bundles.php:
Argentum\FeedBundle\ArgentumFeedBundle::class => ['all' => true],
Configure Basic Feed
Add minimal config in config/packages/argentum_feed.yaml:
argentum_feed:
channels:
news:
title: 'My News Feed'
link: '/'
description: 'Latest updates'
First Use Case: Generate a Feed In a controller or service:
use Argentum\FeedBundle\Feed\Feedable;
class News implements Feedable {
// Implement getFeedItem() as shown in README
}
// Controller action
public function generateFeed(FeedFactory $feedFactory) {
$newsItems = $this->newsRepository->findAllPublished();
$rss = $feedFactory->createFeed('news')
->addFeedableItems($newsItems)
->render();
return new Response($rss, 200, ['Content-Type' => 'application/rss+xml']);
}
Pattern: Implement Feedable interface for Eloquent models or DTOs.
Workflow:
getFeedItem() to map entity fields to FeedItem properties.setRouteName()/setRouteParameters() for Symfony routing (e.g., for link in RSS).yandex:full-text) via addCustomValue().addEnclosure().Example:
$item->setRouteName('blog_post_show')
->setRouteParameters(['slug' => $post->slug])
->addCustomValue('media:content', $post->getFeaturedImageUrl());
config/argentum_feed.yaml:
provider:
repository: 'App\Repository\PostRepository'
method: 'findPublished'
arguments: [10] # Limit 10 items
render() without manually adding items:
$feedFactory->createFeed('blog')->render();
$feed = $feedFactory->createFeed('news')
->setTitle('Breaking News')
->addCustomNamespace('custom', 'http://example.com/ns')
->addCustomElement('custom:priority', 'high');
argentum_feed.renderer:
services:
app.custom_renderer:
class: App\Feed\CustomRenderer
tags: ['argentum_feed.renderer']
Argentum\FeedBundle\Feed\RendererInterface.{{ render(controller('App\Controller\FeedController::generateFeed')) }}
Or pass the feed XML directly:
<iframe srcdoc="{{ feedXml|raw }}"></iframe>
namespaces:
yandex: 'http://news.yandex.ru'
Feedable:
$item->addCustomValue('yandex:full-text', $content);
Routing Issues:
setRouteName(), ensure the route exists and parameters match.php bin/console debug:router.Absolute URLs:
link: '/' in config) are auto-converted to absolute using the request host.setBaseUrl() explicitly:
$feed->setBaseUrl('https://example.com');
Translation Domain:
title, description) are translated using translationDomain.{{ news.title }}).translations/{locale}/news.yaml.Namespace Conflicts:
namespaces and customElements in the feed config.addCustomNamespace() at runtime.Provider Errors:
provider.repository is misconfigured, render() will fail silently.$this->newsRepository->findPublished()->count(); // Test first
Caching:
$feed->setCacheTTL(3600); // Cache for 1 hour
Inspect FeedItem:
$item = $news->getFeedItem();
var_dump($item->toArray()); // Debug structure
Validate XML: Use an online validator (e.g., W3C Feed Validation) to check output.
Log Renderer: Override the renderer to log output:
class DebugRenderer implements RendererInterface {
public function render(Feed $feed) {
file_put_contents('debug_feed.xml', $feed->getXml());
return parent::render($feed);
}
}
Custom Feed Types:
Argentum\FeedBundle\Feed\Feed and tagging it as argentum_feed.feed.Event Listeners:
argentum_feed.build or argentum_feed.render events to modify feeds dynamically:
services:
app.feed_listener:
class: App\EventListener\FeedListener
tags:
- { name: kernel.event_listener, event: argentum_feed.build, method: onBuild }
Symfony Cache: Integrate with Symfony’s cache system for feed caching:
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Cache\CacheInterface;
public function generateFeed(FeedFactory $factory, CacheInterface $cache) {
return $cache->get('feed_news', function() use ($factory) {
return new Response($factory->createFeed('news')->render(), 200, ['Content-Type' => 'application/rss+xml']);
}, 3600);
}
Lazy Loading:
addFeedableItems() with a lazy collection (e.g., Cursor from Doctrine) to avoid loading all items at once.Batch Processing:
$feed->setBatchSize(50); // Process 50 items per batch
Disable Unused Features:
cloud, textInput) to reduce parsing overhead.Default Values:
language, encoding) use sensible defaults (en, UTF-8).setLanguage()/setEncoding().PubDate Handling:
pubDate: 'now' uses the current timestamp. For dynamic dates:
$feed->setPubDate(new \DateTime());
Image URLs:
image.url is absolute or prepend {% app.url %} in Twig:
image:
url: '{{ app.url }}/images/logo.png'
How can I help you explore Laravel packages today?