DEV Community

Cover image for Creating SEO-Friendly Slugs in Laravel: A Step-by-Step Guide
Muhammad Saim
Muhammad Saim

Posted on

Creating SEO-Friendly Slugs in Laravel: A Step-by-Step Guide

Creating SEO-Friendly Slugs in Laravel: A Step-by-Step Guide

In today's digital age, having SEO-friendly URLs is crucial for improving your website's visibility on search engines and enhancing user experience. In this guide, we'll show you how to generate SEO-friendly slugs in Laravel, making your URLs more readable and user-friendly.

Understanding the Importance of Slugs

A slug is a simplified version of a string that represents a resource's title or name in a URL. By optimizing your slugs, you can make your URLs more descriptive and easier for both users and search engines to understand. This can have a positive impact on your website's search engine rankings and overall user engagement.

Implementing Slug Generation in Laravel

To generate SEO-friendly slugs in Laravel, we'll use a trait-based approach. First, we'll create a trait file named GeneralHelpers in the App\Traits directory. Inside this trait, we'll define a function called generateSlug that generates a unique slug for a given model.

Here's how the generateSlug function works:

<?php

namespace App\Traits;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

trait GeneralHelpers
{
    /**
     * Generate a unique slug for a model.
     *
     * @param Model $model The model instance for which the slug is generated.
     * @param string $title The title from which the slug is derived.
     * @param string $column The column name to check for uniqueness.
     * @return string The generated unique slug.
     */
    public function generateSlug(Model $model, string $title, string $column = 'slug'): string
    {
        // Create a slug from the title using Laravel's Str::slug method
        $slug = Str::slug($title);

        // Check if the generated slug already exists in the specified column of the model's table
        $checkSlug = $model::query()->where($column, $slug)->first();

        // If the slug already exists, append a random string to make it unique
        if ($checkSlug) {
            // Append a random string to the original title to create a new slug
            $title = sprintf("%s %s", $title, Str::random(mt_rand(5, 10)));

            // Recursively call the function with the updated title to generate a new slug
            return $this->generateSlug($model, $title, $column);
        }

        // If the slug is unique, return it
        return $slug;
    }
}
Enter fullscreen mode Exit fullscreen mode

Understanding the generateSlug Function

The generateSlug function is responsible for creating a unique slug for a given model. Here's a breakdown of how it works:

  • Create Slug: It first generates a slug from the provided title using Laravel's Str::slug method. This method converts the title to a URL-friendly slug by replacing spaces with hyphens and removing special characters.

  • Check Uniqueness: Next, the function checks if the generated slug already exists in the specified column of the model's table. If a record with the same slug exists, it means the slug is not unique, and we need to generate a new one.

  • Make Slug Unique: If the generated slug is not unique, the function appends a random string to the original title and recursively calls itself with the updated title to generate a new slug. This process continues until a unique slug is generated.

  • Return Slug: Once a unique slug is generated, the function returns it.

Next, we'll use this trait in our controller, such as the PostController, to generate slugs when creating new posts:

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use App\Traits\GeneralHelpers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class PostController extends Controller
{
    use GeneralHelpers;

    /**
     * Create a new post.
     *
     * @param Request $request The HTTP request containing the post data.
     * @return RedirectResponse The response redirecting back to the form page.
     */
    public function store(Request $request): RedirectResponse
    {
        // Validate the post data
        $data = $request->validate([
            'title' => 'required',
            'body' => 'required',
        ]);

        // Create a new Post model instance
        $post = new Post;

        // Create the post with the generated slug
        $post::query()->create([
            'title' => $data['title'],
            'slug' => $this->generateSlug($post, $data['title']),
            'body' => $data['body'],
        ]);

        // Redirect back to the form page with a success message
        return redirect()->back()->with('success', 'Post created successfully');
    }
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

Generating SEO-friendly slugs in Laravel is a simple yet powerful way to improve your website's SEO performance. By using the generateSlug function and incorporating it into your Laravel applications, you can ensure that your URLs are both user-friendly and optimized for search engines. Stay tuned for more Laravel tips and tutorials on our blog!

Top comments (0)