roumen / feed
Framework-agnostic PHP Feed generator for Laravel, Symfony, and more.
Installs: 598 488
Dependents: 9
Suggesters: 0
Security: 0
Stars: 361
Watchers: 17
Forks: 94
Open Issues: 0
Requires
- php: >=8.3
Requires (Dev)
- laravel/framework: ^11.0
- orchestra/testbench: ^9.14
- pestphp/pest: ^3.8
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^11.0
- squizlabs/php_codesniffer: ^3.10
- symfony/cache: ^7.3
- symfony/dependency-injection: ^7.3
- symfony/http-foundation: ^7.0
- symfony/templating: ^6.4
Suggests
- laravel/framework: For Laravel integration
- symfony/http-foundation: For Symfony integration
This package is auto-updated.
Last update: 2025-07-30 13:00:28 UTC
README
A modern, framework-agnostic PHP Feed generator for Laravel, Symfony, and any PHP project. Generate RSS and Atom feeds with full caching support and customizable views.
Features
- 🚀 Framework Agnostic: Works with Laravel, Symfony, or any PHP project
- 📡 Multiple Formats: RSS 2.0 and Atom 1.0 support
- ⚡ Caching: Built-in caching support with framework adapters
- 🎨 Custom Views: Use your own templates for feed generation
- 🔧 Dependency Injection: Clean architecture with adapter pattern
- ✅ 100% Test Coverage: Thoroughly tested with Pest
- 📋 PSR-12 Compliant: Follows modern PHP standards
- 🔒 Type Safe: Full PHP 8.3+ type declarations
Requirements
- PHP 8.3+
- Composer
Installation
composer require rumenx/php-feed
Usage Examples
Laravel
Basic Usage:
use Rumenx\Feed\FeedFactory; class FeedController extends Controller { public function feed() { $feed = FeedFactory::create(); $feed->setTitle('My Blog Feed'); $feed->setDescription('Latest posts from my blog'); $feed->setLink('https://example.com'); $feed->addItem([ 'title' => 'First Post', 'author' => 'Rumen', 'link' => 'https://example.com/post/1', 'pubdate' => now(), 'description' => 'This is the first post.' ]); // Return XML string directly $xml = $feed->render('rss'); return response($xml, 200, [ 'Content-Type' => 'application/xml' ]); } }
Using Laravel Views (Optional):
For more control, you can use the included Blade templates:
use Rumenx\Feed\FeedFactory; class FeedController extends Controller { public function feed() { $feed = FeedFactory::create(); $feed->setTitle('My Blog Feed'); $feed->addItem([ 'title' => 'First Post', 'author' => 'Rumen', 'link' => 'https://example.com/post/1', 'pubdate' => now(), 'description' => 'This is the first post.' ]); // Get data for your own view template $items = $feed->getItems(); $channel = [ 'title' => $feed->getTitle(), 'description' => $feed->getDescription(), 'link' => $feed->getLink() ]; return response()->view('feed.rss', compact('items', 'channel'), 200, [ 'Content-Type' => 'application/xml' ]); } }
Symfony
Basic Usage:
use Rumenx\Feed\FeedFactory; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class FeedController extends AbstractController { public function feed(): Response { $feed = FeedFactory::create(); $feed->setTitle('My Blog Feed'); $feed->setDescription('Latest posts from my blog'); $feed->setLink('https://example.com'); $feed->addItem([ 'title' => 'First Post', 'author' => 'Rumen', 'link' => 'https://example.com/post/1', 'pubdate' => new \DateTime(), 'description' => 'This is the first post.' ]); // Return XML response $xml = $feed->render('atom'); return new Response($xml, 200, ['Content-Type' => 'application/xml']); } }
Using Symfony Views (Optional):
For more control, you can use Twig templates:
class FeedController extends AbstractController { public function feed(): Response { $feed = FeedFactory::create(); $feed->setTitle('My Blog Feed'); $feed->addItem([ 'title' => 'First Post', 'author' => 'Rumen', 'link' => 'https://example.com/post/1', 'pubdate' => new \DateTime(), 'description' => 'This is the first post.' ]); // Get data for your own Twig template $items = $feed->getItems(); $channel = [ 'title' => $feed->getTitle(), 'description' => $feed->getDescription(), 'link' => $feed->getLink() ]; return $this->render('feed/atom.xml.twig', [ 'items' => $items, 'channel' => $channel ], new Response('', 200, ['Content-Type' => 'application/xml'])); } }
Plain PHP / Other Frameworks
Simple Usage (Recommended):
require 'vendor/autoload.php'; use Rumenx\Feed\FeedFactory; // Create feed with simple built-in adapters $feed = FeedFactory::create(); $feed->setTitle('My Feed'); $feed->setDescription('Feed description'); $feed->setLink('https://example.com'); $feed->addItem([ 'title' => 'Hello World', 'author' => 'Rumen', 'link' => 'https://example.com/hello', 'pubdate' => date('c'), 'description' => 'Hello world post!' ]); // Output RSS feed header('Content-Type: application/xml'); echo $feed->render('rss');
Advanced - Custom Adapters:
You can provide your own implementations for cache, config, response, and view:
use Rumenx\Feed\Feed; $feed = new Feed([ 'cache' => new MyCacheAdapter(), 'config' => new MyConfigAdapter(), 'response' => new MyResponseAdapter(), 'view' => new MyViewAdapter(), ]); $feed->setTitle('My Feed'); $feed->addItem([ 'title' => 'Hello', 'author' => 'Rumen', 'link' => 'https://example.com/hello', 'pubdate' => date('c'), 'description' => 'Hello world!' ]); // Use render() for framework-specific response // or render() for XML string in plain PHP echo $feed->render('rss');
Development
Available Composer Scripts
# Run tests composer test # Run tests with coverage composer test:coverage # Run tests with HTML coverage report composer test:coverage-html # Watch tests (automatically re-run on file changes) composer test:watch # Static analysis with PHPStan composer analyse # Check code style (PSR-12) composer style # Fix code style automatically composer style:fix # Run all checks (tests + analysis + style) composer check # Run CI checks (coverage + analysis + style) composer ci
API Reference
Factory Method
// Create feed with simple adapters (recommended for most users) $feed = FeedFactory::create($config);
Core Methods
// Feed configuration $feed->setTitle(string $title): self $feed->setDescription(string $description): self $feed->setLink(string $link): self $feed->setDateFormat(string $format): self $feed->setLanguage(string $language): self // Item management $feed->addItem(array $item): self $feed->addItems(array $items): self // Rendering $feed->render(string $format = 'rss'): mixed // Returns framework-specific response or XML string // Caching $feed->isCached(string $key): bool $feed->clearCache(string $key): self
Architecture
This package follows a clean architecture pattern with dependency injection:
- Feed: Core feed generator class
- Adapters: Framework-specific implementations
FeedCacheInterface
: Caching operationsFeedConfigInterface
: Configuration accessFeedResponseInterface
: HTTP response handlingFeedViewInterface
: Template rendering
Support This Project
If you find this project useful, please consider supporting its development:
Other ways to support:
- ⭐ Star this repository
- 🐛 Report bugs and suggest improvements
- 💻 Contribute code or documentation
- 💖 Make a donation - See FUNDING.md for details
Contributing
We welcome contributions! Please see our Contributing Guide for details.
Security
If you discover any security-related issues, please check our Security Policy.
License
This package is open-sourced software licensed under the MIT License.