Installation:
composer require pishran/laravel-persian-slug
For Laravel 7, use pishran/laravel-persian-slug:1.4.
Publish Config (Optional):
php artisan vendor:publish --provider="Pishran\LaravelPersianSlug\LaravelPersianSlugServiceProvider"
(Default config is minimal; only publish if customizing behavior.)
First Use Case:
Add HasPersianSlug trait to an Eloquent model (e.g., Post) and define getSlugOptions():
use Pishran\LaravelPersianSlug\HasPersianSlug;
use Spatie\Sluggable\SlugOptions;
class Post extends Model
{
use HasPersianSlug;
public function getSlugOptions(): SlugOptions
{
return SlugOptions::create()
->generateSlugsFrom('title') // Field to slugify
->saveSlugsTo('slug'); // Column to store slug
}
}
Generate Slugs:
$post = new Post(['title' => 'مقاله نمونه']);
$post->save(); // Slug auto-generated (e.g., "maqaleh-namune")
$post = Post::create(['title' => 'مقاله دیگر']);
Slug Generation:
generateSlugsFrom() with multiple fields:
->generateSlugsFrom(['title', 'subtitle'])
- (e.g., _):
->slugs(['separator' => '_'])
Integration with Spatie Sluggable:
->unique()
->on('posts')
->saveSlugsTo('slug')
Model Events:
creating/updating to enforce slugs:
protected static function boot()
{
parent::boot();
static::creating(fn ($model) => $model->generateSlug());
}
API/Forms:
generateSlug() method explicitly for validation:
$request->validate(['title' => 'required']);
$post->generateSlug(); // Ensure slug exists before saving
Custom Slug Logic:
Override generateSlug() in the model:
public function generateSlug(): void
{
$this->slug = Str::persianSlug($this->title, '-', true);
}
Seeding:
Use factory() with slugs:
Post::factory()->create(['title' => 'مقاله تستی']);
API Resources: Expose slugs in responses:
public function toArray($request)
{
return [
'slug' => $this->slug,
// ...
];
}
Locale Conflicts:
app.php locale is set to Persian ('locale' => 'fa') if using Persian-specific rules (e.g., Str::persianSlug()).Str::persianSlug():
Str::persianSlug($title, '-', true, 'fa');
Unique Slugs:
unique() requires a slug column. If missing, slugs may collide.unique() to getSlugOptions():
->unique()
Database Collation:
utf8mb4_unicode_ci. Use utf8mb4_general_ci for slugs.ALTER TABLE posts MODIFY slug VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Caching:
Cache::remember("slug_{$model->id}", now()->addHours(1), fn () => $model->slug);
Log Slugs: Add a temporary method to inspect slug generation:
public function debugSlug()
{
dd(Str::persianSlug($this->title, '-', true));
}
Check Config:
Verify config/persian-slug.php if slugs appear malformed (e.g., separator or limit settings).
Custom Rules:
Extend Pishran\LaravelPersianSlug\Rules\PersianSlug for validation:
use Pishran\LaravelPersianSlug\Rules\PersianSlug;
$request->validate([
'slug' => ['required', new PersianSlug],
]);
Service Provider: Bind custom slug generators:
$this->app->bind('slug', fn () => new CustomPersianSlugGenerator());
Testing: Mock slug generation in tests:
$post = Post::factory()->make(['title' => 'test']);
$post->shouldReceive('generateSlug')->once();
How can I help you explore Laravel packages today?