pishran/persian-slug
pishran/persian-slug یک پکیج ساده برای ساخت اسلاگ استاندارد با پشتیبانی کامل از فارسی است. ورودیهای فارسی و انگلیسی را به اسلاگهای خوانا تبدیل میکند (مثل سلام دنیا → سلام-دنیا، Hello world → hello-world). نصب با Composer.
Installation:
composer require pishran/persian-slug
No additional configuration is required—just autoload the package.
First Use Case: Generate a Persian-friendly slug from a string:
use Pishran\PersianSlug\PersianSlug;
$slug = PersianSlug::slug('سلام دنیا!'); // Output: "سلام-دنیا"
$slug = PersianSlug::slug('Hello world!'); // Output: "hello-world"
Where to Look First:
Generating Slugs in Controllers:
public function store(Request $request)
{
$title = $request->input('title');
$slug = PersianSlug::slug($title); // Auto-converts to slug
// Save to DB: $model->slug = $slug;
}
Form Request Validation: Use the package to sanitize slugs before saving:
public function rules()
{
return [
'title' => 'required|string',
'slug' => 'nullable|string|unique:posts,slug',
];
}
public function withValidator($validator)
{
$validator->after(function ($validator) {
$slug = PersianSlug::slug($this->title);
$this->merge([
'slug' => $slug,
]);
});
}
Model Observers:
Auto-generate slugs on creating:
class PostObserver
{
public function creating(Post $post)
{
if (empty($post->slug)) {
$post->slug = PersianSlug::slug($post->title);
}
}
}
API Responses: Normalize slugs in responses:
return response()->json([
'data' => [
'title' => $post->title,
'slug' => PersianSlug::slug($post->title), // Ensure consistency
],
]);
Laravel Routes: Use slugs in route parameters:
Route::get('/posts/{slug}', [PostController::class, 'show']);
Ensure the slug is URL-friendly (e.g., سلام-دنیا → %D8%A7%D8%B3%D9%84%D8%A7%D9%85-%D8%AF%D9%86%DB%8C%D8%A7 in UTF-8).
SEO Meta Tags: Dynamically generate slugs for Open Graph/Twitter cards:
$metaSlug = PersianSlug::slug($post->title, '-', true); // Force lowercase
Localization:
Combine with Laravel’s Str::slug() for mixed-language content:
$slug = Str::contains($title, ['ا', 'ب', 'ج'])
? PersianSlug::slug($title)
: Str::slug($title);
URL Encoding:
Persian characters in slugs (e.g., سلام) must be UTF-8 encoded for URLs:
$encodedSlug = urlencode(PersianSlug::slug('سلام دنیا')); // "سلام-دنیا"
// OR use Laravel's `Str::of($slug)->toRoute()` for automatic encoding.
Collisions:
Slugs like سلام-دنیا and سلام-دنیا-2 may conflict. Handle uniqueness in the DB:
$slug = PersianSlug::slug($title);
$originalSlug = $slug;
$count = 2;
while (Post::where('slug', $slug)->exists()) {
$slug = "{$originalSlug}-{$count}";
$count++;
}
Special Characters: The package removes most special chars, but test edge cases like:
PersianSlug::slug('سلام!@# دنیا'); // "سلام-دنیا"
PersianSlug::slug('Hello_World'); // "hello-world"
Performance: Avoid regenerating slugs in loops or heavy operations. Cache results if needed:
$slug = Cache::remember("slug_{$title}", now()->addHours(1), function() use ($title) {
return PersianSlug::slug($title);
});
Unexpected Output:
Check for hidden Unicode characters (e.g., ). Use:
dd(Str::of($input)->toPlainString()); // Inspect raw string
Case Sensitivity: The package converts to lowercase by default. Override with:
PersianSlug::slug('HELLO', '-', false); // "HELLO-world"
Custom Rules: Extend the slug logic via a service provider:
PersianSlug::extend(function ($string, $separator = '-', $lowercase = true) {
// Add custom logic (e.g., replace 'php' with 'laravel')
return str_replace('php', 'laravel', $string);
});
Middleware: Sanitize slugs in incoming requests:
public function handle($request, Closure $next)
{
$request->merge([
'slug' => PersianSlug::slug($request->slug),
]);
return $next($request);
}
Testing: Mock the slugger in unit tests:
$this->partialMock(PersianSlug::class, function ($mock) {
$mock->shouldReceive('slug')->andReturn('test-slug');
});
How can I help you explore Laravel packages today?