Laravel News, Eloquent modelleri için yeni Laravel Sluggable paketine dikkat çekti. Bu paket, otomatik bir slug oluşturma çözümü sunuyor ve açıkça söylemek gerekirse, ekosisteme böyle basit bir şeyin dahil edilmesi için gerçekten zaman geldi.
Web Geliştiriciler İçin Neden Önemli
Herhangi bir içerik odaklı Laravel uygulaması geliştiriyorsanız, temiz ve okunabilir URL’lere ihtiyacınız olduğunu bilirsiniz. Bu, “Özel Karakterler İçeren Harika Blog Gönderim!” başlıklı bir yazıyı “ozel-karakterler-icerien-harika-blog-gonderim” gibi bir forma dönüştürmek anlamına geliyor. Bu sadece estetikle ilgili değil; iyi sluglar, SEO açısından kritik öneme sahip, içeriğinizi arama motorları için daha keşfedilebilir kılıyor. Ancak slug oluşturmanın her seferinde kendiniz yapmak, benzersizlikle ilgilenmek ve başlıklar değiştiğinde güncellemek gibi işlemler tekrarlayıcı bir iş haline geliyor. Bu paket, tüm bu sıkıntıları ortadan kaldırıyor, size aslında içeriğe ve özelliklere odaklanma fırsatı tanıyor. Birkaç modelle projede saatlerce zaman kazanmaktan bahsediyoruz.
Teknik Gerçeklik
Kurulumu oldukça kolay. Paketi alıyorsunuz, Eloquent modelinize bir trait ekliyorsunuz ve hangi alandan slug kaynağı alacağını belirtiyorsunuz. Varsayılan olarak benzersizliği sağlıyor, gerekli olduğunda numara ekliyor. Mesela, bir Post modeliniz olduğunu ve onun title alanını sluglaştırmak istediğinizi varsayalım. İşte bunu çalıştırmanın yolu:
// Post modelinizde (app/Models/Post.php)
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
class Post extends Model
{
use HasSlug;
protected $fillable = ['title', 'content', 'slug'];
public function getSlugOptions() : SlugOptions
{
return SlugOptions::create()
->generateSlugsFrom('title')
->saveSlugsTo('slug');
}
}
Veritabanı tablounuza bir slug sütunu eklemeniz gerekecek. Bunu basit bir migration ile halledebilirsiniz:
// Migration dosyanızda (örneğin, 2023_10_27_create_posts_table.php)
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up() : void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->string('slug')->unique(); // Burada sihir oluyor
$table->timestamps();
});
}
public function down() : void
{
Schema::dropIfExists('posts');
}
};
Artık, bir gönderi oluşturduğunuzda veya güncellediğinizde, slug alanı otomatik olarak dolduruluyor. Temel bir özelliği eklemek bu kadar kolay.
Bugün Gerçekten Ne Yapardım
- Paketi yükle:
composer require spatie/laravel-sluggable. Spatie paketleri genellikle sağlamdır, bu yüzden bunu kutudan çıkar çıkmaz güveniyorum. - Bir
slugsütunu ekle: İlgili Eloquent modellerimestringtüründeslugadlı bir sütun eklemek için bir migration oluşturun ve bunununique()olduğundan emin olun. HasSlugtrait’ini ekle:use HasSlug;vegetSlugOptions()metodunu her ihtiyaç duyduğunuz modele ekleyin.SlugOptionsyapılandır: Doğru kaynak niteliğine (örneğintitleveyaname) ve yenislugsütununa işaret etmek içingenerateSlugsFrom()vesaveSlugsTo()seçeneklerini belirtin.- Test et: Birkaç yeni kayıt oluşturun, bazı mevcutlarını güncelleyin ve slugların doğru ve benzersiz bir şekilde oluşturulduğunu doğrulayın.
Dikkat Edilmesi Gerekenler
Paket harika, ancak dikkat edilmesi gereken noktalar her zaman vardır. Eğer slugsız mevcut veriniz varsa, bu paket bunları otomatik olarak doldurmayacak; eski kayıtlar için slugs yaratmak için ayrı bir script veya bir php artisan tinker oturumu kullanmanız gerekecek. Ayrıca, title alanınız değiştiğinde, slug varsayılan olarak yeniden oluşturulacak. Bu genellikle istediğiniz bir durum, ancak başlık düzenlendiğinde kalıcı ve değişmeyen sluglara ihtiyacınız varsa, bunu doNotGenerateSlugsOnUpdate() ile yapılandırmalısınız. Benzersizliği sağlasa da, çok benzer başlıklarla karmaşık kenar koşulları, my-post-1, my-post-2, my-post-3 gibi ideal olmayan sluglar üretebilir. Bu yaygın bir sorun ve bu pakete özgü değil. Ayrıca, incelediğim bu sürüm, çok dilli slugları kutudan çıkar çıkmaz desteklemiyor, bu da küresel uygulamalar için gerçekten bir sıkıntı olabilir.
Laravel projelerinizde slugları yönetmek için tercih ettiğiniz yaklaşım nedir? Kendiniz mi oluşturuyorsunuz yoksa bu tür bir paket iş akışınıza daha mı uygun?
Kaynak: Orijinal Makale


