Laravel 10 Create RSS Feed Example

In Laravel, creating an RSS feed can be useful for providing regularly updated content to users or other applications in a standardized format. RSS (Rich Site Summary or Really Simple Syndication) is a web feed format that allows users to subscribe to and receive updates from websites or blogs.

Step 1: Install Laravel App

composer create-project laravel/laravel example-app

Step 2: Create  Migration and Model

php artisan make:migration create_posts_table

database/migrations/create_posts_table.php

<?php
  
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
      
    return new class extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up(): void
        {
            Schema::create('posts', function (Blueprint $table) {
                $table->id();
                $table->string('title');
                $table->string('slug');
                $table->text('body');
                $table->timestamps();
            });
        }
      
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down(): void
        {
            Schema::dropIfExists('posts');
        }
    };

For new migration then create table in database run below command:

php artisan migrate

now create model

php artisan make:model Post

app/Models/Post.php

<?php
  
    namespace App\Models;
      
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
      
    class Post extends Model
    {
        use HasFactory;
      
        protected $fillable = [
            'title', 'slug', 'body'
        ];
    }

Step 3: Create Post Factory

run below command to create post factory. 

php artisan make:factory PostFactory

add below code and update PostFactory.php

database/factories/PostFactory.php

<?php
  
    namespace Database\Factories;
       
    use Illuminate\Database\Eloquent\Factories\Factory;
    use App\Models\Post;
    use Illuminate\Support\Str;
        
    /**
     * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post>
     */
    class PostFactory extends Factory
    {
        /**
         * The name of the factory's corresponding model.
         *
         * @var string
         */
        protected $model = Post::class;
          
        /**
         * Define the model's default state.
         *
         * @return array
    
         */
        public function definition(): array
        {
            return [
                'title' => $this->faker->text(),
                'slug' => Str::slug($this->faker->text()),
                'body' => $this->faker->paragraph()
            ];
        }
    }

Run tinker command and create dummy posts.

php artisan tinker
    
    App\Models\Post::factory()->count(30)->create();

Step 4: Create Route

routes/web.php 

<?php
  
  use Illuminate\Support\Facades\Route;
    
  use App\Http\Controllers\RSSFeedController;
     
  /*
  |--------------------------------------------------------------------------
  | Web Routes
  |--------------------------------------------------------------------------
  |
  | Here is where you can register web routes for your application. These
  | routes are loaded by the RouteServiceProvider within a group which
  | contains the "web" middleware group. Now create something great!
  |
  */
      
  Route::get('feed', [RSSFeedController::class, 'index']);

Step 5: Create Controller

app/Http/Controllers/RSSFeedController.php 

<?php
  
    namespace App\Http\Controllers;
      
    use Illuminate\Http\Request;
    use App\Models\Post;
    use Illuminate\Http\Response;
      
    class RSSFeedController extends Controller
    {
        /**
         * Write code on Method
         *
         * @return response()
         */
        public function index(): Response
        {
            $posts = Post::latest()->get();
      
            return response()->view('rss', [
                'posts' => $posts
            ])->header('Content-Type', 'text/xml');
        }
    }

Step 6: Create View File

resources/views/rss.blade.php 

<?=
    '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL
    ?>
    <rss version="2.0">
        <channel>
            <title><![CDATA[ webthestuff.com ]]></title>
            <link><![CDATA[ https://your-website.com/feed ]]></link>
            <description><![CDATA[ Your website description ]]></description>
            <language>en</language>
            <pubDate>{{ now() }}</pubDate>
      
            @foreach($posts as $post)
                <item>
                    <title><![CDATA[{{ $post->title }}]]></title>
                    <link>{{ $post->slug }}</link>
                    <description><![CDATA[{!! $post->body !!}]]></description>
                    <category>{{ $post->category }}</category>
                    <author><![CDATA[Hardk Savani]]></author>
                    <guid>{{ $post->id }}</guid>
                    <pubDate>{{ $post->created_at->toRssString() }}</pubDate>
                </item>
            @endforeach
        </channel>
    </rss>

Run Project:

php artisan serve

Go to web browser, type the URL and view the output:

http://localhost:8000/feed