eko / feedbundle
从实体构建RSS订阅的工具包
Requires
- php: ^7.2 || ^8.0
- laminas/laminas-feed: ^2.4
- symfony/framework-bundle: ^4.4|^5.3|^6.0|^7.0
- symfony/translation: ^4.4|^5.3|^6.0|^7.0
Requires (Dev)
- doctrine/orm: ^2.17
- phpunit/phpunit: ^8.5 || ^9.5 || ^10.5
Suggests
- doctrine/orm: ~2.17
- dev-master
- 2.2.0
- 2.1.0
- 2.0.0
- 1.2.9
- 1.2.8
- 1.2.7
- 1.2.6
- 1.2.5
- 1.2.4
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.8
- 1.1.7
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.1
- 1.0.0
- dev-dependabot/composer/phpunit/phpunit-tw-11.3.6
- dev-dependabot/composer/phpunit/phpunit-tw-11.3.5
- dev-dependabot/composer/doctrine/orm-tw-3.2
- dev-analysis-zRP5yD
- dev-analysis-zYjeyo
This package is auto-updated.
Last update: 2024-09-20 04:13:28 UTC
README
从实体构建RSS/Atom订阅的工具包
功能
- 生成XML订阅(RSS & Atom格式)
- 易于配置和使用
- 基于实体的项目
- 添加项目组
- 添加媒体标签
- 翻译订阅数据
- 读取XML订阅并填充您的Symfony实体
- 通过Symfony控制台命令将订阅导出到文件
安装
将包添加到您的 composer.json
文件中
"eko/feedbundle": "dev-master",
将此添加到 config/bundles.php
文件中
<?php return [ // ... Eko\FeedBundle\EkoFeedBundle::class => ['all' => true], ];
配置(只需3个简单步骤!)
1) 创建一个文件:config/packages/eko_feed.yml
以下配置行是必需的
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
您也可以将链接设置为Symfony路由
link: route_name: acme_blog_main_index route_params: {id: 2} # necessary if route contains required parameters
2) 实现ItemInterface
您将用于生成RSS订阅的每个实体都需要实现 Eko\FeedBundle\Item\Writer\ItemInterface
或 Eko\FeedBundle\Item\Writer\RoutedItemInterface
,如本示例中为博客的Article
实体所示
选项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 {
在此实体中,只需实现这些必需的方法
public function getFeedItemTitle() { … }
: 此方法返回实体项目标题public function getFeedItemDescription() { … }
: 此方法返回实体项目描述(或内容)public function getFeedItemPubDate() { … }
: 此方法返回实体项目发布日期public function getFeedItemLink() { … }
: 此方法返回实体项目链接(URL)
选项B: Eko\FeedBundle\Item\Writer\RoutedItemInterface
如果您需要使用路由服务生成实体的链接,则可以使用以下接口。您无需担心将路由器注入到实体中。
<?php namespace Bundle\BlogBundle\Entity; use Eko\FeedBundle\Item\Writer\RoutedItemInterface; /** * Bundle\BlogBundle\Entity\Article */ class Article implements RoutedItemInterface {
在此实体中,您需要实现以下方法
public function getFeedItemTitle() { … }
: 此方法返回实体项目标题public function getFeedItemDescription() { … }
: 此方法返回实体项目描述(或内容)public function getFeedItemPubDate() { … }
: 此方法返回实体项目发布日期public function getFeedItemRouteName() { … }
: 此方法返回路由名称public function getFeedItemRouteParameters() { … }
: 此方法必须返回一个数组,包含用于路由的必需参数public function getFeedItemUrlAnchor() { … }
: 此方法返回将附加到路由器生成的URL的锚点。注意:可以是空字符串。
3) 生成订阅!
现在动作发生在您的控制器中。只需声明一个新操作,并使用以下示例行
<?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' } }
请注意,为了提高性能,您可以为缓存控制添加内容。
此外,可以通过添加方法单独添加实体对象
<?php $feed = $this->get('eko_feed.feed.manager')->get('article'); $feed->add($article);
进一步使用您的订阅
添加一些自定义频道字段
您可以通过这种方式为主频道添加自定义字段
<?php $feed = $this->get('eko_feed.feed.manager')->get('article'); $feed->add(new FakeEntity()); $feed->addChannelField(new ChannelField('custom_name', 'custom_value'));
添加一些自定义项目字段
添加自定义项目字段
您可以通过这种方式为实体节点添加自定义项目字段
<?php $feed = $this->get('eko_feed.feed.manager')->get('article'); $feed->add(new FakeEntity()); $feed->addItemField(new ItemField('fake_custom', 'getFeedItemCustom'));
当然,在您的实体中需要声明 getFeedItemCustom()
方法。
添加一组自定义项目字段(可选,带有属性)
您也可以通过这种方式添加组项目字段,如果您的返回值为数组
<?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') ) );
甚至,在组中添加多个项目字段,如下所示
$feed->addItemField( new GroupItemField('author', array( new ItemField('name', 'getFeedItemAuthorName', array('cdata' => true)), new ItemField('email', 'getFeedItemAuthorEmail') ) );
甚至,在组中嵌套组项目字段,如下所示
$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]') )) ) );
添加一组自定义频道字段
就像您可以为字段添加项目一样,您还可以添加一组自定义的频道字段,如下所示:
$feed->addChannelField( new GroupChannelField('author', array( new ChannelField('name', 'My author name'), new ChannelField('email', '[email protected]') ) );
添加自定义媒体项目字段
可以使用以下方式使用 MediaItemField
字段类型添加媒体封装:
<?php $feed = $this->get('eko_feed.feed.manager')->get('article'); $feed->add(new FakeEntity()); $feed->addItemField(new MediaItemField('getFeedMediaItem'));
getFeedMediaItem()
方法必须返回一个包含以下键的数组: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' ); }
这些媒体项目也可以使用 GroupItemField
进行分组。
使用 Symfony 控制台命令导出您的源
如果您不想实时生成它,可以将您的源导出到 .xml 文件。使用 php app/console eko:feed:dump
Symfony 命令。
以下是一些选项
带有所有选项的示例
php app/console eko:feed:dump --name=article --entity=AcmeDemoBundle:Fake --filename=test.xml --format=atom --orderBy=id --direction=DESC www.myhost.com
这将得到以下结果
Start dumping "article" feed from "AcmeDemoBundle:Fake" entity...
done!
Feed has been dumped and located in "/Users/vincent/dev/perso/symfony/web/test.xml"
使用 Eko\FeedBundle\Service\FeedDumpService 导出您的源
您可以通过简单地使用 "Eko\FeedBundle\Service\FeedDumpService
" 服务来导出您的源。该命令使用的值相同。如果您已经准备好项目源,您可以使用 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();
如有任何疑问,请随时联系我并/或参与。
读取 XML 源并填充实体
如果您只想读取 XML 源,请按照以下方式操作:
<?php $reader = $this->get('eko_feed.feed.reader'); $reader->setHydrator(new DefaultHydrator()); $feed = $reader->load('https://php.ac.cn/feed.atom')->get();
$feed
将是一个 \Zend\Feed\Reader\Feed\FeedInterface
,您可以对其进行操作。
您还可以从 XML 源填充一个实体。这很简单。
只需加载源并调用 populate 方法,传递需要实现 Eko\FeedBundle\Item\Reader\ItemInterface
的实体名称,查看以下示例
<?php $reader = $this->get('eko_feed.feed.reader'); $reader->setHydrator(new DefaultHydrator()); $items = $reader->load('https://php.ac.cn/feed.atom')->populate('MyNamespace\Entity\Name');
在这个示例中,$items
将是一个数组,其中包含用给定的源内容填充的实体数组。
使用自定义加湿器填充实体
您还可以编写自己的加湿器并以这种方式使用它
$reader = $this->get('eko_feed.feed.reader'); $reader->setHydrator(new MyCustomHydrator()); $items = $reader->load('https://php.ac.cn/feed.atom')->populate('MyNamespace\Entity\Name');
这样,您的自定义加湿器将代替 Eko\FeedBundle\Hydrator\DefaultHydrator
使用。
定义自定义源格式化程序
您可以使用以下标记定义自己的源格式化程序:
<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>
然后,通过简单地调用 $feed->render('custom')
来使用它。
贡献者
-
Vincent Composieux [email protected] (Twitter: @vcomposieux)
-
Rob Masters [email protected]
-
Thomas P [email protected] (Twitter: @scullwm)
-
有人想要贡献吗?请不要犹豫,您将在这里列出!