Laravel 10 Generate Sitemap XML File Example

In Laravel, the use of a sitemap XML file can help improve search engine optimization (SEO) by providing search engines with a structured map of your website's pages. This file contains information about the URLs, their priorities, and the frequency of changes.

To generate a sitemap XML file in Laravel, you can follow these steps:

Step 1: Install Laravel

composer create-project laravel/laravel example-app

Step 2: Create Post Migration and Model 

Now,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');
        }
    };

run migration using below command:

php artisan migrate

create Post 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 

php artisan make:factory PostFactory

database/factories/PostFactory.php

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

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\SitemapController;
       
    /*
    |--------------------------------------------------------------------------
    | 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('sitemap.xml', [SitemapController::class, 'index']);

Step 5: Create Controller 

app/Http/Controllers/SitemapController.php

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

Step 6: Create View File 

resources/views/sitemap.blade.php

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        @foreach ($posts as $post)
            <url>
                <loc>{{ url('/') }}/post/{{ $post->slug }}</loc>
                <lastmod>{{ $post->created_at->tz('UTC')->toAtomString() }}</lastmod>
                <changefreq>daily</changefreq>
                <priority>0.8</priority>
            </url>
        @endforeach
    </urlset>

Run Laravel App:

php artisan serve

Now, Go to web browser, type the URL and see the output:

http://localhost:8000/sitemap.xml