eko/feedbundle
Composer 安装命令:
composer require eko/feedbundle
包简介
A Symfony bundle to build RSS feeds from entities
README 文档
README
A Symfony bundle to build RSS/Atom feeds from entities
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 command
Installation
Add the package to your composer.json file
"eko/feedbundle": "dev-master",
Add this to to the config/bundles.php file:
<?php return [ // ... Eko\FeedBundle\EkoFeedBundle::class => ['all' => true], ];
Configuration (only 3 quick steps!)
1) Create a file: config/packages/eko_feed.yml
The following configuration lines are required:
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:
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 namespace Bundle\BlogBundle\Entity; use Eko\FeedBundle\Item\Writer\ItemInterface; /** * Bundle\BlogBundle\Entity\Article */ class Article implements ItemInterface {
In this same entity, just implement those required methods:
public function getFeedItemTitle() { … }: this method returns entity item titlepublic function getFeedItemDescription() { … }: this method returns entity item description (or content)public function getFeedItemPubDate() { … }: this method returns entity item publication datepublic function getFeedItemLink() { … }: this method returns entity item link (URL)
Option B: Eko\FeedBundle\Item\Writer\RoutedItemInterface
Alternatively, if you need to make use of the router service to generate the link for your entity you can use the following interface. You don't need to worry about injecting the router to your entity.
<?php namespace Bundle\BlogBundle\Entity; use Eko\FeedBundle\Item\Writer\RoutedItemInterface; /** * Bundle\BlogBundle\Entity\Article */ class Article implements RoutedItemInterface {
In this entity, you'll need to implement the following methods:
public function getFeedItemTitle() { … }: this method returns entity item titlepublic function getFeedItemDescription() { … }: this method returns entity item description (or content)public function getFeedItemPubDate() { … }: this method returns entity item publication datepublic function getFeedItemRouteName() { … }: this method returns the name of the routepublic function getFeedItemRouteParameters() { … }: this method must return an array with the parameters that are required for the routepublic function getFeedItemUrlAnchor() { … }: this method returns the anchor that will be appended to the router-generated url. Note: can be an empty string.
3) Generate the feed!
The action now takes place in your controller. Just declare a new action with those examples lines:
<?php namespace App\Controller; use Eko\FeedBundle\Feed\FeedManager; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class BlogController extends AbstractController { /** * @var FeedManager */ protected $feedManager; /** * Constructor. * * @param FeedManager $feedManager */ public function __construct(FeedManager $feedManager) { $this->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 $feed = $this->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 $feed = $this->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 $feed = $this->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 $feed = $this->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:
$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:
$feed->addItemField( new GroupItemField('authors', array( new GroupItemField('author', array( new ItemField('name', 'Vincent', array('cdata' => true)), new ItemField('email', 'vincent@test.com') )), new GroupItemField('author', array( new ItemField('name', 'Audrey', array('cdata' => true)), new ItemField('email', 'audrey@test.com') )) ) );
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:
$feed->addChannelField( new GroupChannelField('author', array( new ChannelField('name', 'My author name'), new ChannelField('email', 'myauthor@email.org') ) );
Add custom media item fields
Media enclosure can be added using the MediaItemField field type as below:
<?php $feed = $this->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:
/** * 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 use Eko\FeedBundle\Service\FeedDumpService; $feedDumpService = $this->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 $reader = $this->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 $reader = $this->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:
$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:
<service id="acme.my_bundle.formatter.custom" class="Acme\MyBundle\Feed\Formatter\CustomFormatter"> <tag name="eko_feed.formatter" format="custom"></tag> <argument type="service" id="translator" /> </service>
Then, use it by simply calling $feed->render('custom').
Contributors
-
Vincent Composieux vincent.composieux@gmail.com (Twitter: @vcomposieux)
-
Rob Masters mastahuk@gmail.com
-
Thomas P thomas@scullwm.com (Twitter: @scullwm)
-
Anyone want to contribute ? Do not hesitate, you will be listed here!
eko/feedbundle 适用场景与选型建议
eko/feedbundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 587.88k 次下载、GitHub Stars 达 141, 最近一次更新时间为 2012 年 06 月 26 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「bundle」 「atom」 「feed」 「rss」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 eko/feedbundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 eko/feedbundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 eko/feedbundle 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A Symfony bundle for Mutex implementation for PHP
2lenet/EasyAdminPlusBundle
The bundle for easy using json-rpc api on your project
Provide a way to secure accesses to all routes of an symfony application.
Simple RSS generator library for PHP 5.5 or later. clone from Bhaktaraz Bhatta ttps://github.com/bhaktaraz/php-rss-generator
DMS Meetup API Bundle, enables Meetup API clients in services
统计信息
- 总下载量: 587.88k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 144
- 点击次数: 21
- 依赖项目数: 7
- 推荐数: 1
其他信息
- 授权协议: MIT
- 更新时间: 2012-06-26