Skip to main content
URLs provide SEO-friendly slugs for models such as products, collections, and brands.

Overview

URLs provide SEO-friendly slugs for models such as products, collections, and brands. Instead of exposing database IDs in storefront routes:
A URL slug allows routes like:
URLs are polymorphic, so any Eloquent model can support them. Each URL belongs to a language, and each model can have one default URL per language.
URLs are not to be confused with Laravel routes. They provide a slug-based lookup mechanism for storefront routing, not route definitions.

Model

Fields

Relationships

Scopes

Creating a URL

URLs can be created directly or through a model’s urls() relationship.

Default URL behavior

Only one URL can be the default per element and language combination. When a new URL is created or updated with default set to true, any existing default URL for that same element and language is automatically set to false.
This behavior is scoped to each language independently. Setting a default for one language does not affect defaults in another language.

Deleting a URL

When a default URL is deleted, Lunar automatically promotes another URL for the same element and language to become the new default.

Adding URL support to models

Lunar ships with URL support on the following models:
  • Lunar\Models\Product
  • Lunar\Models\Collection
  • Lunar\Models\Brand
To add URL support to a custom model, use the HasUrls trait:

Available relationships

The HasUrls trait provides the following relationships:
When a model using the HasUrls trait is deleted (hard delete only), all associated URLs are automatically removed.

Automatic URL generation

Lunar can automatically generate a URL when a model with the HasUrls trait is created. This is controlled by the generator option in config/lunar/urls.php.

Default generator behavior

The built-in Lunar\Generators\UrlGenerator performs the following steps when a model is created:
  1. Checks whether the model already has any URLs (skips generation if it does).
  2. Reads the model’s name column, falling back to the name attribute (via attr('name')).
  3. Converts the name to a slug using Str::slug().
  4. Ensures uniqueness by appending a numeric suffix if the slug already exists (e.g. test-product, test-product-2, test-product-3).
  5. Creates the URL as the default for the system’s default language.

Custom generator

To customize URL generation, create a class with a handle method that accepts an Eloquent model:
Then reference it in the config:
To disable automatic generation entirely, set the generator to null: