HomeBackend GeliştirmePHP

PHP’de Enum Nedir Ne Değildir? Laravel’de Nasıl Kullanırız?

PHP’de Enum Nedir Ne Değildir? Laravel’de Nasıl Kullanırız?

Geliştirici olarak projelerinizde bir değişkenin alabileceği değerlerin önceden belirlenmiş olan değerlerle sınırlandırıldığı durumlarla karşılaşmışsınızdır. Buna örnek olarak WordPress’in post_status değerini düşünebiliriz. Yazıların durumlarının alabileceği değerler önceden belirlenmiştir. Bunları “published”, “draft” ve “deleted” olarak düşünebiliriz.

PHP 8.1 ile gelen ENUM’lar sayesinde artık bunları daha derli toplu ve düzgün bir şekilde projelerimizde tanımlayabiliyoruz. 8.1’den önce ben bu işlemi Interface kullanarak yapıyordum. Bu yazıyı hazırlarken yaptığım araştırmada karşıma ilginçte bir örnek çıktı, örneği sevgili Doğan Uçar hazırlamış, blog yazısına buradan ulaşabilirsiniz. Gitmeye üşenirseniz de aşağıda örneği sizinle paylaşıyorum, kıyaslama yaparken hatalı bir geri bildirim almanızı sağlayacak bir durumu gösteriyor aslında:

Tabii dediğim gibi bunu deneyimlemedim hiç.

Kabaca Enum’ları gösterelim. Bunun içinde yine gördüğüm güzel bir örnek üzerinden gitmek istiyorum. Detaylı yazıya buradan ulaşabilirsiniz.

PHP’deki Enums’un temellerini keşfetmek için Harry Potter’ın büyülü dünyasından yararlanmaya karar verdim.

Hayal edelim ki, Hogwarts Cadılık ve Büyücülük Okulu için kod yazıyoruz ve her yeni öğrenci, sanal Seçmen Şapka tarafından bir binaya yerleştirilmeli.

Hogwarts’ta yalnızca dört bina vardır: Gryffindor, Hufflepuff, Ravenclaw ve Slytherin.

Bu durum, PHP’de bir Enum olarak şöyle temsil edilebilir:

Bu örnekte, , , ve olmak üzere dört olası değeri olan bir ’u oluşturduk.

Şimdi, her öğrencinin bir özelliğine sahip olduğu bir sınıfı oluşturalım.


Ayrıca, yöntemi olan bir sınıfımız var. Bu yöntem, öğrenciye bir bina önerisi sunulmasını kabul edebilir ya da öğrenciye rastgele bir bina atayabilir. Aynı Harry Potter’daki gibi, Seçmen Şapka Harry’nin tercihini dikkate aldı!

Gördüğünüz gibi, değişkeni ve özelliği değerlerini yalnızca dört Hogwarts binasından biriyle sınırladık, bunu Enum’u kullanarak yaptık.

Bir öğrenciyi var olmayan bir binaya yerleştirmeye çalışırsan, PHP bunu yakalar ve çalıştırmaz.

İşte bu, Enums’un sihirli yanı!

Bu senaryoda, Hogwarts binalarıyla ilişkili herhangi bir veri olmayan durumlar “Pure Cases” olarak adlandırılır ve yalnızca Pure Cases içeren bir Enum, bizim House Enum’umuz gibi, “Pure Enum” olarak adlandırılır.

Örnek bu kadar. Bu örnek dediğim gibi yukarıda paylaştığım bağlantıdan alıntı. Ama durumu son derece iyi açıklıyor, o nedenle kaynak göstererek paylaşmakta hiç bir sakınca görmedim. Umarım problem olmaz :)

Pure Enum’ları bu örnekle son derece iyi bir şekilde açıklandığını düşünüyorum. Şimdi geriye kaldı Backed Enum kavramı.

Backed Enum, bir skaler değerle desteklenen Enum’tur. Bu yüzden, “pure” olarak kabul edilmezler.

PHP’de skaler bir değer, bool, float, int veya string türünde olabilir.

Kod bazen kelimelerden daha fazla şey ifade eder, bu yüzden az önceki örneğin devamı niteliğinde bir örnek ile Backed Enum kavramına ışık tutalım:

Gördüğünüz gibi, Enum’u destekleyen türü (bu durumda ) tanımladık ve her duruma bir değer atadık. Daha basit olamazdı. Ama neden Backed Enum kullanmalısın?

İşte harika bir kullanım örneği:

Bu örnekte:

  • Veritabanından bir veri aldığımızı varsayıyoruz ve yeni bir nesnesi oluşturuyoruz.
  • özelliğini bir string değerden statik yöntemiyle başlatıyoruz (çünkü artık türünde bir Backed Enum’dur).
  • Bu işlem başarısız olursa, bir istisna atılır. (Uncaught ValueError: "Foo" is not a valid backing value for enum "House")

Bazı durumlarda, bir exception atmak yerine varsayılan bir değere geri dönmek isteyebilirsin. Bunu, başarısızlık durumunda döndüren statik yöntemiyle nasıl yapabileceğini gösteren bir örnek:

Benjamin Crozat tarafından hazırlanmış bu örnekler harika bir şekilde anlatıyor. Daha da derin bir yazıyı kendisinin bloğunda okuyabilirsiniz. Bağlantısını tekrar paylaşmak istiyorum :)

Enum’lardan Laravel’de Nasıl Faydalanabiliriz?

Laravel içerisinde Enum’lardan nasıl faydalandığımı kendi tecrübem ile yola çıkarak paylaşacağım. Eğer daha fazla örnek varsa lütfen yorumlarda benimle paylaşmaktan çekinmeyin.

Ben Enum’ları Model ve FormRequest’lerde kullanıyorum. Çalıştığım proje itibariyle farklı tipte mağazalarla entegrasyon hazırlamış durumdayım. Bunlar şimdilik Shopify ve WooCommerce. Bunlar için öncelikle projemin app/ dizini içerisinde Enums isminde bir dizinim var. app/Enums/StoreTypeEnum.php isimli PHP dosyamın içeriği ise şu şekilde:

Enum case isimlendirirken snake case kullanmayı tercih ediyorum. Hatta screaming snake case’i tercih ediyorum. Farklı isimlendirme kuralları ile ilgili bir yazı yakın zamanda hazırlayacağım, bu tarz isimlendirme kurallarınızın olması projenizin sürdürülebilirliği açısından oldukça önemlidir.

Bu StoreType enum’unu daha sonra Store modelimde $casts içerisinde tanımlıyorum. Böylelikle modelim type özelliği her zaman bu enum oluyor. Örnek:

Artık bir StoreType varlığı haline dönüşüyor. Resource’larda bunu hazırlarken şeklinde yazdırmanıza gerek yok. olarak kullanabilirsiniz ve Laravel sizin yerinize value‘yu otomatik olarak yanıtta gösterecektir.

Benzer şekilde bir form’da kabul ettiğiniz verileri bu enumlarla sınırlayabilirsiniz. Ben tüm form işlemleri için FormRequest kullanmayı tercih ediyorum. Yeni bir Store kaydetmek için hazırlanan formda type için kabul edilebilecek değerleri normalde ‘in:woocommerce,shopify’ ile sağlıyordum fakat bunu artık enum sınıfımla yapıyorum. Önce in: ile nasıl yapıldığına sonra enum ile nasıl yapıldığına bir bakış atalım:

Fakat store tiplerinizin sayısını çeşitlendikçe bunu düzenli bir şekilde tutmanız da zorlaşacaktır. İşte şimdi Enum ile nasıl yapacağınız:

Tüm bunları göz önüne aldığımıza PHP 8.1 ile hayatımıza dahil olan Enum’ların ne kadar kıymetli olduğunu bir parçada olsa anlatabilmişimdir umarım.

Güncelleme

Laravel’de kullanımıyla ilgili bazı makalelerde migration’larda kullanıldığını gördüm fakat bunun bu şekilde kullanılmasını tavsiye etmiyorum. Çünkü veritabanında enum tipinde bunu sınırlandırmak her değişiklik yapmak istediğinizde veritabanına da müdahale etmeniz demek ki bu bana çok sağlıklı gelmiyor. Onun yerine validation sürecinde ve model casting ile bu süreci yönetmeniz çoook daha sağlıklı olacaktır.

Daha Eski Gönderi

Yorumlar

TOPLAM 0
DISQUS: 0