Laravel 中创建 RSS Feed 教程

RSS feed

在 Laravel 中创建一个 RSS 订阅并不是什么难事,但是使用一个现成的包和一些小技巧能够帮助你更快的创建一个 RSS 订阅。

下面我们将使用 spatie/laravel-feed 包来从一个全新的 Laravel 5.6 项目走到服务 RSS 订阅。

安装

首先,我们需要创建一个新的 Laravel 项目。你可以使用 laravel new 安装器命令,或者使用 composer:

composer create-project --prefer-dist laravel/laravel:5.6 rss-example
cd rss-example

然后,我们需要安装 spatie/laravel-feed 包,并复制其配置文件到项目中:

composer require spatie/laravel-feed
php artisan vendor:publish\
  --provider="Spatie\Feed\FeedServiceProvider"\
  --tag="config"

数据建模

我们将创建一些测试模型数据为事件集设置 RSS 源。假定这些模型就是为接下来要举办的教堂或者小组活动准备的 RSS 源。模型名称 Event 稍显累赘,但是这是我能想到的最好名字了,接下来我们均使用这个名字。

首先,我们为 RSS 源创建模型以及迁移\文件和工厂文件:

php artisan make:model Event -mf
Model created successfully.
Factory created successfully.
Created Migration: 2018_04_03_033916_create_events_table

在迁移类中,定义一个简单的数据库结构:

public function up()
{
    Schema::create('events', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->text('description');
        $table->string('author');
        $table->timestamps();
    });
}

接下来,打开 database/factories/EventFactory.php 文件然后增加如下内容:

$factory->define(App\Event::class, function (Faker $faker) {
    return [
        'title' => $faker->sentence,
        'description' => "<p>".implode("</p>\n\n<p>", $faker->paragraphs(rand(3,6)))."</p>",
        'author' => $faker->name,
    ];
});

也许有生成 HTML 描述的更佳方式,但我仍假设用于创建事件的 UI 会提供用于编写描述的 WYSIWYG 字段。

我们可以使用上文中的已定义的数据库结构和工厂类填充一些测试数据,用以完成我们的 RSS 源设置。

php artisan make:seeder EventsSeeder

在已创建的 EventsSeeder类中,生成一些可用的数据库填充事件:

<?php

use Illuminate\Database\Seeder;

class EventsSeeder extends Seeder
{
    /**
     * 运行数据库填充
     *
     * @return void
     */
    public function run()
    {
        factory('App\Event', 50)->create();
    }
}

然后,添加 EventsSeeder 到 DatabaseSeeder 类:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * 运行数据库填充
     *
     * @return void
     */
    public function run()
    {
        $this->call(EventsSeeder::class);
    }
}

你或许需要运行 composer dump-autoload 来加载种子文件,这取决于你是怎么创建它们的。然后,执行迁移(假定你已经按照文档配置好数据库)来创建数据表并填充一些数据:

php artisan migrate:fresh --seed
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2018_04_03_034457_create_events_table
Migrated:  2018_04_03_034457_create_events_table
Seeding: EventsSeeder

就这样,我们已经有一些假数据来继续了!

配置模型

使用 Spatie 包,我们在 App\Event 模型中实现一个接口来支持 spatie/laravel-feed 包的配置。

我们有两个方法可以用来生成 Event 模型的 Feed。

  1. 方法 toFeedItem(),用以支持 Spatie Feedable 接口
  2. 静态方法 getFeedItems(),用以获取全部 Feed 项目

首先,这是基于 app/Event.php 中的 Schema 实现的 toFeedItem() 方法:

<?php

namespace App;

use Spatie\Feed\Feedable;
use Spatie\Feed\FeedItem;
use Illuminate\Database\Eloquent\Model;

class Event extends Model implements Feedable
{
    public function toFeedItem()
    {
        return FeedItem::create()
            ->id($this->id)
            ->title($this->title)
            ->summary($this->description)
            ->updated($this->updated_at)
            ->link($this->link)
            ->author($this->author);
    }
}

暂时这个方法还不能正常运行,因为我们并没有 link 属性,然而,这已经足够使我们继续了。

上面,我们正在把单一模型实例转换为一个可以生成最终 RSS 格式的 FeedItem 实例。

接下来,我们要在 Event.php 文件中添加静态方法 getFeedItems()

public static function getFeedItems()
{
   return static::all();
}

我们仅需要返回一个包含 FeedItem 实例的集合。

我们需要在模型中添加的最后一个方法是 $event->link 属性访问器:

public function getLinkAttribute()
{
    return route('events.show', $this);
}

我们使用隐式路由绑定,为 Event 模型创建了用在 RSS 项中的 link 属性。

路由和 Events 控制器

我们需要做的最后一部分是建立一个控制器及一个路由,好让我们的 route('events.show', $this) 能正常执行。

首先,我们建立一个控制器:

php artisan make:controller EventsController
Controller created successfully.

EventsController 内,建立一个 show() 方法,该方法返回一个包含 Event model 的 JSON 回应。我们不会在这个教学中,将 EventsController@show 返回 HTML;我将那部分留给你:

<?php

namespace App\Http\Controllers;

use App\Event;
use Illuminate\Http\Request;

class EventsController extends Controller
{
    public function show(Request $request, Event $event)
    {
        return $event;
    }
}

接下来,我们需要在之前我们发布生成的 config/feed.php 文件中注册 RSS 源路由:

<?php

return [
    'feeds' => [
        'main' => [
            'items' => 'App\Event@getFeedItems',

            /*
             * 这个 feed 将作用于此 url 。 
             */
            'url' => '/events.rss',

            'title' => 'Upcoming Events',
        ],
    ],
];

最后,我们需要将 RSS 路由 和  EventsController@show 路由添加到 routes/web.php 底部:

Route::get('/events/{event}', 'EventsController@show')
    ->name('events.show');

Route::feeds();

Route::feeds() 方法是一个路由宏,它定义了 config/feed.php 配置文件中必要的路由。我们使用 {event} 路由参数并利用之前使用的隐式路由模型绑定来从模型内部生成事件链接。

我们现在应该能在 /events.rss 找到 RSS 源了!

Linking to the Feed

You can also add an RSS link to the default welcome page by adding @include('feed::links') in the <head> of the view:

<!doctype html>
<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>
        @include('feed::links')
{{-- ... --}}

If you visit the homepage of the project, you'll get something like the following linktag:

<link
  rel="alternate"
  type="application/rss+xml"
  href="http://127.0.0.1:8000/events.rss"
  title="Upcoming Events"
>

With hardly any effort, we created a working RSS feed for our model data, and you can imagine how little you'd have to do to add RSS to existing model data in your applications!

了解更多

浏览 laravel-feed GitHub page 获取源码和软件包设置的相关内容。

昨天我在 优化 Laravel 路由小贴士 中写了一些有关路由宏的东西,并且 Laravel 数据填充包有一个非常棒的路由宏定义在 FeedServiceProvider 中,建议去看下。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laravel-news.com/learn-to-create...

译文地址:https://learnku.com/laravel/t/9484/creat...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!