TL;DR
TL;DR
Kısa bir özetle, migration dosyalarınızda business layer’ınızı referans almayın.
Migrations, veritabanı geçmişinizin değişmez anlık görüntüleri olmalıdır; gelişen uygulama koduna bağımlı olmamalıdır.
❌ Bad (breaks if enum class changes or is removed)
$table->enum('role', array_column(Can::cases(), ));
✅ Good (enum values explicitly defined, stable and independent)
$table->enum(, [, ]);
Tümünü Oku
Tümünü Oku
Bir modelde enum değerleri tanımladığımızda, kullanıcıya bir seçim yapabilmesi için enum sınıfını referans alarak bu değerleri kaynak üzerinde göstermek iyi bir pratiktir. Bu şekilde, aynı değerleri tüm projede (backend, frontend) yazmak zorunda kalmazsınız. Aşağıda örnek bir kullanım verilmiştir:
// app/Enums/Role.php
enum Role: string
{
case Admin = ;
case Moderator = ;
case User = ;
}
{{-- resources/views/users/form.blade.php --}}
Bu iyi bir yaklaşımdır, değil mi? Eğer enum üzerinden bu değerleri göstermek yerine, projenin her yerinde aynı değerleri yeniden yazmayı deneseydiniz, hiç de hoş olmazdı.
Neden Migrations Farklıdır?
Neden Migrations Farklıdır?
Migrations, uygulama kodunuz gibi değildir; veritabanınızın zaman içinde nasıl evrildiğinin tarihi kayıtlarıdır. Bir migration üretim ortamında çalıştırıldıktan sonra asla değiştirilmeyecek şekilde tasarlanmalıdır.
Migrations, veritabanı changelog’unuz olmalıdır
Migrations, veritabanı changelog’unuz olmalıdır
- Her zaman dilimi boyunca şema değişikliklerini belgeler
- Dinamik referanslar ile bu belgeleri kaybedersiniz
- Migrations’a bakarak şemanın nasıl evrildiğini anlamak mümkün olmaz
Kırılganlık
Kırılganlık
- Bugün:
Roleenum’uadminveuserdeğerlerine sahiptir - Migration çalıştırılır: Bu değerlerle birlikte kolon oluşturulur, her şey yolunda ✓
- 6 ay sonra:
Roleenum’uUserRoleolarak yeniden adlandırılır ya da tamamen silinir - Yeni bir geliştirici migrations’ı çalıştırır: 💥 Fatal error – Role class not found
Sonuç Olarak
Sonuç Olarak
- Eski migrations’ları düzenleme zorunluluğu doğar
- Ek iş yükü yaratır
- Hata riski artırır
Bonus
Bonus
Ayrıca, foreignIdFor() kullanımından kaçının çünkü bu, migration’ı doğrudan bir model ile ilişkilendirir. Eğer o model silinirse veya yeniden adlandırılırsa, migration geçersiz duruma gelir.
Bu kadar, arkadaşlar.
Kaynak: Orijinal Makale


