Laravel ile Yazılım Geliştirme Üzerine

Photo credit: Laravel

Laravel ile Yazılım Geliştirme Üzerine

Laravel, son dört yıldır php dili ile bir uygulama geliştirme düşüncesine girdiğim an hep tercihim olmuş web uygulaması geliştirme çatısı.

bununla geliştirdiğim ve halihazırda sorunsuz bir şekilde çalışan, ara ara güncellediğim ve yeni özellikler eklediğim 10 taneden fazla web uygulaması mevcut. içerisinde elektronik ticaret, crm, sipariş otomasyonu, içerik yönetim sistemi, depo ürün lokasyon takibi, çok dilli içerik portalları, araç kiralama platformu vb. bulunan uygulamalar bunlar.

kodu/yazılımı/geliştirme ortamını bir kenara bırakıp bu sistemlerin gerçek dünyada nasıl davranacağını iyi tasarlamak gerekiyor. günün sonunda bu uygulamaları insanlar kullanıyor ve bir değer üretiyorlar.

bu uygulamaları geliştirme süreçlerinin içerisinde başkalarının geliştirdiği kodları inceleme fırsatım oldu. bu kodlar; daha çok yarım kalmış, teslim tarihi yaklaşmış ve yetiştirilmesi mümkün olmayan uygulamalara aitti. birkaç tanesine el attım, birkaç tanesine baştan yazılması gerektiğini belirterek bu işi yapmayacağımı söyledim. ayrıca github’da laravel ile yazılmış cms, blog, eticaret vs. uygulamaları da inceledim. yazmaktansa satın almanın daha iyi olacağını düşünüp parasını ödeyerek envato’dan satın aldığım uygulamaların kodlarını da inceledim.

tüm bu gözlemlerden ve deneyimlerden sonra sitemle birlikte birkaç tavsiyede bulunmak istiyorum.

sanırım laravel’le uygulama geliştirenler döküman okumaktan acizler. route-controller-model-view kısmını okuyup öğrendiklerini sanarak yazmaya başlıyorlar. iyi kötü bu dökümanlar piyasada birkaç iyi php developer çıkardı fakat ‘ben laravel biliyorum.’ diyenlerin çoğu daha mvc’nin, tasarım desenlerinin, dry’nin, uygulama mimarisi tasarlamanın yakınından bile geçmiyor.

view dosyasında model sınıfı kullanıp veri çeken, tüm işi controllerda halleden, controller içinde mail attıran, önbellekten bihaber olan, gereksiz session kullanan, aynı işleri yapan ayrı ayrı view dosyaları oluşturan, service provider, policy, gate, command, queue hak getire.

söyleyecek çok şey var fakat ben şikayetçi olmayı, eleştirmeyi sevmiyorum. bu yüzden bu başlık altına gelip bir şeyler öğrenmek isteyenlere birkaç tavsiye bırakacağım.

  • uygulama yaşam döngüsünü iyi öğrenin. istek nereden nereye gidiyor, nerelere uğruyor, hangi yapı isteği nasıl manipüle ediyor. bunu öğrendiğinizde hangi aşamada nelere sahip olduğunuzu ve neler yapabileceğinizi görebiliyorsunuz.

  • doğrulama ve yetkilendirme yapılarını inceleyin. mutlaka laravel’le gelen giriş çıkış kayıt işlemlerini kontrol edebileceğiniz bir yapıya büründürün. uygulamanızın yönetim paneli de olacaksa önyüzün kullanıcıları ile yönetim paneli kullanıcılarını ayırın. kullanıcıları aynı tabloda tutmayın bunun için guard yapısını kullanın.

  • rol ve izin yönetimini kullanın. kullanıcıların yapabileceklerini rol ve izinlerle kontrol edin. policy bunun için var.

  • service provider’ın durduğu yeri kavrayın. kendi service providerlarınızı yazın.

  • mümkün olduğunca controllerda az kod bulundurun. controllerlar iş yapmak için değil yaptırmak için varlar.

  • route dosyalarınızı organize hale getirin. daha anlaşılır olacaksa parçalamaktan çekinmeyin. bir middleware’i birden çok rotada kullanacaksanız bu rotaları mümkünse grup içerisine alın.

  • bir model üzerinde crud işlemleri yapıyorsanız resource controller kullanın. gereksiz yere route dosyasını şişirmeyin.

  • anlamlı ve kısa ingilizce endpointler verin. users, products, customers, roles gibi.

  • resource controller kullandığınız yerde route model binding yapabileceğinizi düşünün. veri ilişkilendirilmemiş bir şekilde ve değişikliğe uğramadan işinize yarayacaksa aynı işi metot içerisinde yazmayın bind edin.

  • form doğrulama işlemlerini controllerda yapmayın. gidin form request sınıfı yazın, metota bind edin.

  • view dosyalarınızı rotalarınızla eşleştirin. products diye bir endpoint varsa views altında products/index.blade.php products/create.blade.php gibi controller rotası ve metotuna göre view dosyalarına isim verin. böylece proje dosyalarına aşinalığınız artacak ve neyi nerede aradığınızı bileceksiniz.

  • yazılımcılar tembel insanlardır. bir işi tekrar tekrar yapmayın. gidin bir macroserviceprovider yazın, macro dosyalarınızı dahil edin. view macroları yazın. veri şöyleyse şunu yap şöyleyse bunu yap işlerini macroda tanımlayın. sonra viewda macroyu çağırın. daha temiz view dosyaları elde edin.

  • veri setlerinizi viewlara composerlarla bağlayın. composerserviceprovider yazın. hangi viewda hangi composer metotunun çalışacağını tanımlayın. mümkünse veriyi önbelleğe koyun. mesela kategori listesini her seferinde dbden getirip view içine basmaktansa bir composera bağlayıp önbellekten getirip kategori view dosyasına o veriyi aktarın. istediğiniz yerde kategori view dosyasını include edin.

  • modellerinizi sade tutun. ilişkileri, mutatorleri, eventleri modelde tutabilirsiniz. aynı işi birden fazla modelde yapacaksanız, trait kullanın ya da modelleri bir üst modelden extend edin.

  • repository pattern kullanın. kod tabanınız genişleyecektir fakat uygulamanızın daha organize ve genişletilmeye müsait olduğunu göreceksiniz. interfaceler yazın. controllerınız bu interfacelerle çalışsın. ioc containerın nimetlerinden faydalanın.

  • bir süre sonra controller metotlarınızda iş yapan kısımların parametreler olduğunu metotun gövdesinde ise sadece sonuca göre yapılacak işlerin kaldığını göreceksiniz.

  • mail, bildirim, sms gibi işler için eventleri kullanın. eventleri hemen işlemeyip kuyruğa alma yolunu tercih edin. eventlistenerlar yazın. yazdığınız kodlar hep bir sınıf yapısında olsun. eventlistenerı closure olarak da yazabilirsiniz. fakat eventten gelen verinin manipüle edilmesi gerekeceği durumda bu manipülasyonu yapan kodu closure içerisinde yazmaktansa eventlistener sınıfında private bir metot olarak tanımlamak işleri ayırmak açısından önemli.

  • model ilişkilerini iyi tanımlayın. bire çok olarak baktığınız ilişki belki çok-çok ilişkisidir. hatta bunu polymorphic yapmak belki işin büyük kısmını veritabanına bırakıp daha temiz kod yazmanızı sağlayacaktır.

  • veritabanı manipülasyonu için başka araçlar kullanmayın. komut satırını sevin. migrationları etkili kullanın. elle veri girmeyin, model factoryler yazıp fake verileri seed edin.

  • artisan komutları yazıp işleri kolaylaştırın. bu komutları uygulamanız içerisinden çağırın. bırakın onlar aynı işleri tekrar tekrar yapsın.

  • git öğrenin. uygulamanızı versiyonlayın. daha kolay takip edebileceğinizi farkedin.

  • vaktiniz bolsa önce test yazın. (ah ah)

  • sunucu ile haşır neşir olun. geliştirme ortamınızı tanıyın. yazılımların nasıl kurulacağını, nasıl ayarlanacağını, dosya izinlerini, yerelleştirmeyi, zaman işlemlerini yapmayı öğrenin.

  • deployment hizmetlerini inceleyin. aws, digitalocean, google cloud platform gibi hizmetleri test edin. uygulamanızı deploy edin.

  • redis, memcached, varnish, nginx, elasticsearch gibi yazılımların nasıl çalıştığını kavrayın. kullanın.