Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/eko/feedbundle
A Symfony bundle to build RSS feeds from your entities
https://github.com/eko/feedbundle
feed php symfony symfony-bundle xml xml-feed
Last synced: 1 day ago
JSON representation
A Symfony bundle to build RSS feeds from your entities
- Host: GitHub
- URL: https://github.com/eko/feedbundle
- Owner: eko
- License: mit
- Created: 2012-06-24T12:25:36.000Z (over 12 years ago)
- Default Branch: master
- Last Pushed: 2024-10-07T04:33:33.000Z (about 1 month ago)
- Last Synced: 2024-10-30T03:41:25.579Z (15 days ago)
- Topics: feed, php, symfony, symfony-bundle, xml, xml-feed
- Language: PHP
- Homepage: http://vincent.composieux.fr
- Size: 292 KB
- Stars: 141
- Watchers: 10
- Forks: 49
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
FeedBundle
==========A Symfony bundle to build RSS/Atom feeds from entities
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/5620e128-834b-462c-b6fc-395609c57999/big.png)](https://insight.sensiolabs.com/projects/5620e128-834b-462c-b6fc-395609c57999)
[![Build Status](https://secure.travis-ci.org/eko/FeedBundle.png?branch=master)](http://travis-ci.org/eko/FeedBundle)
[![Latest Stable Version](https://poser.pugx.org/eko/feedbundle/version.png)](https://packagist.org/packages/eko/feedbundle)
[![Total Downloads](https://poser.pugx.org/eko/feedbundle/d/total.png)](https://packagist.org/packages/eko/feedbundle)Features
--------* Generate XML feeds (RSS & Atom formats)
* Easy to configure & use
* Items based on your entities
* Add groups of items
* Add enclosure media tags
* Translate your feed data
* Read XML feeds and populate your Symfony entities
* Dump your feeds into a file via a Symfony console commandInstallation
------------Add the package to your `composer.json` file
```
"eko/feedbundle": "dev-master",
```Add this to to the `config/bundles.php` file:
```php
['all' => true],
];
```Configuration (only 3 quick steps!)
-----------------------------------### 1) Create a file: config/packages/eko_feed.yml
The following configuration lines are required:
```yaml
eko_feed:
hydrator: your_hydrator.custom.service # Optional, if you use entity hydrating with a custom hydrator
translation_domain: test # Optional, if you want to use a custom translation domain
feeds:
article:
title: 'My articles/posts'
description: 'Latests articles'
link: 'http://vincent.composieux.fr'
encoding: 'utf-8'
author: 'Vincent Composieux' # Only required for Atom feeds
```You can also set link as a Symfony route:
```yaml
link:
route_name: acme_blog_main_index
route_params: {id: 2} # necessary if route contains required parameters
```### 2) Implement the ItemInterface
Each entities you will use to generate an RSS feed needs to implement `Eko\FeedBundle\Item\Writer\ItemInterface` or `Eko\FeedBundle\Item\Writer\RoutedItemInterface` as demonstrated in this example for an `Article` entity of a blog:
#### Option A: Eko\FeedBundle\Item\Writer\ItemInterface
```php
feedManager = $feedManager;
}/**
* Generate the article feed
*
* @Route("/feed.rss", name="app_feed")
*
* @return Response XML Feed
*/
public function feed()
{
$articles = $this->getDoctrine()->getRepository('BundleBlogBundle:Article')->findAll();$feed = $this->feedManager->get('article');
$feed->addFromArray($articles);return new Response($feed->render('rss')); // or 'atom'
}
}
```Please note that for better performances you can add a cache control.
Moreover, entities objects can be added separately with add method:
```php
get('eko_feed.feed.manager')->get('article');
$feed->add($article);
```Go further with your feeds
--------------------------### Add some custom channel fields
You can add custom fields to main channel by adding them this way:
```php
get('eko_feed.feed.manager')->get('article');
$feed->add(new FakeEntity());
$feed->addChannelField(new ChannelField('custom_name', 'custom_value'));
```### Add some custom items fields
##### Add custom item fields
You can add custom items fields for your entities nodes by adding them this way:
```php
get('eko_feed.feed.manager')->get('article');
$feed->add(new FakeEntity());
$feed->addItemField(new ItemField('fake_custom', 'getFeedItemCustom'));
```Of course, `getFeedItemCustom()` method needs to be declared in your entity.
##### Add a group of custom item fields (optionally, with attributes)
You can also add group item fields using this way, if your method returns an array:
```php
get('eko_feed.feed.manager')->get('article');
$feed->add(new FakeEntity());
$feed->addItemField(
new GroupItemField(
'categories',
new ItemField('category', 'getFeedCategoriesCustom', array(), array('category-attribute', 'test'),
array('categories-attribute', 'getAttributeValue')
)
);
```or even, multiple item fields in a group, like this:
```php
$feed->addItemField(
new GroupItemField('author', array(
new ItemField('name', 'getFeedItemAuthorName', array('cdata' => true)),
new ItemField('email', 'getFeedItemAuthorEmail')
)
);
```or even, nested group item field in a group, like this:
```php
$feed->addItemField(
new GroupItemField('authors', array(
new GroupItemField('author', array(
new ItemField('name', 'Vincent', array('cdata' => true)),
new ItemField('email', '[email protected]')
)),
new GroupItemField('author', array(
new ItemField('name', 'Audrey', array('cdata' => true)),
new ItemField('email', '[email protected]')
))
)
);
```##### Add a group of custom channel fields
As you can do for item fields, you can also add a custom group of channel fields like this:
```php
$feed->addChannelField(
new GroupChannelField('author', array(
new ChannelField('name', 'My author name'),
new ChannelField('email', '[email protected]')
)
);
```##### Add custom media item fields
Media enclosure can be added using the `MediaItemField` field type as below:
```php
get('eko_feed.feed.manager')->get('article');
$feed->add(new FakeEntity());
$feed->addItemField(new MediaItemField('getFeedMediaItem'));
```The `getFeedMediaItem()` method must return an array with the following keys: type, length & value:
```php
/**
* Returns a custom media field
*
* @return string
*/
public function getFeedMediaItem()
{
return array(
'type' => 'image/jpeg',
'length' => 500,
'value' => 'http://website.com/image.jpg'
);
}
```This media items can also be grouped using `GroupItemField`.
### Dump your feeds by using the Symfony console command
You can dump your feeds into a .xml file if you don't want to generate it on the fly by using the `php app/console eko:feed:dump` Symfony command.
Here are the options :
Option
Description
--name
Feed name defined in eko_feed configuration
--entity
Entity to use to generate the feed
--filename
Defines feed filename
--orderBy
Order field to sort by using findBy() method
--direction
Direction to give to sort field with findBy() method
--format
Formatter to use to generate, "rss" is default
--limit
Defines a limit of entity items to retrieve
Host
Defines the host base to generate absolute Url
An example with all the options:
`php app/console eko:feed:dump --name=article --entity=AcmeDemoBundle:Fake --filename=test.xml --format=atom --orderBy=id --direction=DESC www.myhost.com`
This will result:
```
Start dumping "article" feed from "AcmeDemoBundle:Fake" entity...
done!
Feed has been dumped and located in "/Users/vincent/dev/perso/symfony/web/test.xml"
```### Dump your feeds by using the Eko\FeedBundle\Service\FeedDumpService
You can dump your feeds by simply using the "`Eko\FeedBundle\Service\FeedDumpService`" service. Used by the dump command, you have the same value to set.
If you already have you items feed ready, you can dump it using the setItems().```php
get(FeedDumpService::class);
$feedDumpService
->setName($name)
//You can set an entity
//->setEntity($entity)
// Or set you Items
->setItems($MyOwnItemList)
->setFilename($filename)
->setFormat($format)
->setLimit($limit)
->setDirection($direction)
->setOrderBy($orderBy)
;$feedDumpService->dump();
```For any question, do not hesitate to contact me and/or participate.
### Read an XML feed and populate an entity
If you only want to read an XML feed, here is the way:
```php
get('eko_feed.feed.reader');
$reader->setHydrator(new DefaultHydrator());
$feed = $reader->load('http://php.net/feed.atom')->get();
````$feed` will be a `\Zend\Feed\Reader\Feed\FeedInterface` that you can manipulate.
--------------------------------------------------------------------------------
You can also populate an entity from an XML feed. This is very easy.
Just load the feed and call the populate method with your entity name which needs to implement `Eko\FeedBundle\Item\Reader\ItemInterface`, take a look on this example:
```php
get('eko_feed.feed.reader');
$reader->setHydrator(new DefaultHydrator());
$items = $reader->load('http://php.net/feed.atom')->populate('MyNamespace\Entity\Name');
```In this example, `$items` will be an array that will contains an array with your entities populated with the given feed content.
### Use a custom hydrator to populate your entity
You can also write your own hydrator and use it this way:
```php
$reader = $this->get('eko_feed.feed.reader');
$reader->setHydrator(new MyCustomHydrator());$items = $reader->load('http://php.net/feed.atom')->populate('MyNamespace\Entity\Name');
```This way, your custom hydrator will be used instead of the `Eko\FeedBundle\Hydrator\DefaultHydrator`
### Define a custom feed formatter
You can define your own feed formatter by using the following tag:
```xml
```
Then, use it by simply calling `$feed->render('custom')`.
Contributors
------------* Vincent Composieux (Twitter: @vcomposieux)
* Rob Masters
* Thomas P (Twitter: @scullwm)* Anyone want to contribute ? Do not hesitate, you will be listed here!