Beyond Controllers in Laravel Projects: Finding the Right Place for Logic

Mücahit Cücen
istanbulphp
Published in
4 min readNov 9, 2023

Binlerce satır yüzlerce metod tek controller…

Notice: Undefined variable: username in /Users/mcucen/application/index.php on line 9898

Tüm yazılım geliştiriciler hayatlarının bir bölümünde sürdürülebilirliği çok düşük her şeyin tek dosyada yönetildiği projelerde çalışmıştır. Yönetmek demişken lafın gelişi… Bütün geliştirmeyi tek bir yerde yapmak ciddi dezavantajlar getirir. Bu yazıda en basit haliyle karışık bir controller metodunu nasıl sadeleştirebileceğimizi inceleyeceğiz.

Tüm işi tek bir dosyada/metodda çözmeye çalışmanın dezavantajları kısaca aşağıdaki gibidir.

  1. Okunaklılığı düşüktür
  2. Genellikle tekrarlayan kod blokları içerir
  3. Geliştirme sırasında hataya açıktır
  4. Kullanılan framework’ün özellikleri uygulanamaz
  5. Geliştirme ve debug maliyeti yüksektir
  6. Test yazması neredeyse imkansızdır

Peki bu dezavantajlardan kurtulmak için neler yapılabilir?

  1. Sorumlulukları proje içerisinde dağıtmak
  2. Framework özelliklerinden faydalanmak
  3. Best practice’leri takip etmek
  4. Tekerleği yeniden icat etmemeye çalışmak

Şimdi Laravel’de bu dezavantajlardan nasıl kurtulabileceğimizi bir örnek üzerinden adım adım inceleyelim. Siz de geliştirme yaptığınız framework’te benzer özellikleri kullanarak aynı adımları izleyebilirsiniz.

Yukarıdaki örnekte sol taraftaki kalabalık metodu aşağıdaki adımlar ile refactor ederek sağ taraftaki sade hale getireceğiz.

Route Model Binding

Route tanımlamaları yaparken adresten sadece ilgili modelin id bilgisini almak yerine doğrudan modelin kendisini getirebiliyoruz. Bu sayede hem modeli çağırdığımız kısımlardan kurtuluyoruz, hem de hatalı bir id bilgisi geldiğinde Laravel bizim yerimize 404 yanıtı üretiyor.

Route Model Binding

Form Requests

Form Request sınıfları hem kullanıcı yetkilendirmesini kontrol etmemize hem de gelen istekteki verileri doğrulamamıza olanak sağlar. Bu sayede kullanıcının ilgili postu düzenleme yetkisini hem de gönderdiği verinin uygunluğunu controller içerisinde kontrol etmek yerine Form Request sınıfında kontrol edebiliriz.

Form Requests

Policies

Bir önceki başlıkta da değindiğimiz kullanıcı yetkilendirmelerini yönetmek için Policy sınıflarını kullanırız. Bu sınıflar bir kullanıcının herhangi bir aksiyonu yapmaya yetkisi olup olmadığı kontrol eder. Aşağıdaki ekran görüntüsünde bir kullanıcının bir postu güncelleme yetkisi olup olmadığını Policy ve Form Request ile nasıl kontrol edebileceğimizi görebilirsiniz. Yazdığımız Policy metodunu isteği karşılayan Form Request sınıfında kullanıyoruz.

Policies

Action Class

Action Class bir framework özelliği değildir. Yapılacak tek bir işlemi barındıran bir sınıftır. execute ya da handle isminde bir metod içerir ve bu metod bu sınıfın varolma amacı olan aksiyonu içerir. Metod isminin execute/handle olması zorunluluk değildir, istediğiniz ismi verebilirsiniz. Action Class’ın mantıksal olarak tek zorunluluğu, tek bir işlemi yerine getirmek için vardır. Bir action class hem postUpdate hem de postDelete metodları içeremez.

Action Class

Service Class

Service Class yaklaşımı Action Class ile çok benzerdir. Aralarındaki mantıksal tek fark servis sınıfları birden fazla işlemi barındırabilirler. PostUpdate ve PostDelete işlemleri iki farklı aksiyon sınıfı yazmamız gerekirken, bu iki işlemi tek bir servis sınıfı içinde iki farklı metod olarak yazabiliriz.

Service Class

Event/Listeners

Event/Listeners temelde kod akışında herhangi bir aşamada tetiklenen event’leri ve bu event’lerin akabinde yapılacak işlere karşılık gelir. Kod örneğimizde bir post güncelleme işlemi yapıyoruz ve bu işlemi yaptıktan sonra bir PostUpdatedEvent tetikleyip bu event’e birden fazla listener bağlayabiliriz.

Event/Listeners

Jobs

Laravel içerisinde bir Job kısaca yapılacak bir işe karşılık gelir. Kod örneğimizde post güncellendiği zaman cache temizlenmesi işini bir Job ile çözüyoruz. Job’ların en güzel yanı ise senkron çalışabildikleri gibi kuyruklanabilir de olmalarıdır.

Jobs

What’s Next?

Yukarıda değindiğimiz başlıklar haricinde daha temiz kod yazmamıza olanak sağlayacak bazı Laravel başlıklarını da aşağıda bulabilirsiniz.

  1. Observers
  2. Accessors & Mutators
  3. Query Scopes
  4. API Resources

Son olarak bu yazıda anlattıklarımın Teknasyon PHPKonf 2023 sunumunu da ekliyorum. Yeni yazılarda görüşmek üzere👋

Beyond Controllers in Laravel Projects: Finding the Right Place for Logic

--

--