eko/feedbundle

从实体构建RSS订阅的工具包

安装次数: 514,949

依赖者: 8

建议者: 1

安全性: 0

星星: 141

关注者: 10

分支: 49

公开问题: 11

类型:symfony-bundle

2.2.0 2023-12-29 14:02 UTC

README

从实体构建RSS/Atom订阅的工具包

SensioLabsInsight

Build Status Latest Stable Version Total Downloads

功能

  • 生成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\ItemInterfaceEko\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') 来使用它。

贡献者