Composer Versiyon Güncelleme Uyarısı

Composer ile çalışırken şu şekilde bir uyarı alabilirsiniz;

“Warning: This development build of composer is over 30 days old. It is recommended to update it by running “/usr/local/bin/composer self-update” to get the latest version. ”

composer versiyon update uyarısı

composer versiyon update uyarısı

Bu yüklü olan ve bir süre geçmiş olan composer için güncelleme isteniyor demektir. Basit bir komutla güncellemeyi uygulayıp sorunu çözüyoruz.

Not: Composer uygulamanızın ismi sizde farklı olabilir. Yüklü olduğu ismine göre uygulayın. composer.phar veya composer olabilir.

Compser yüklü olduğu dizinde çalıştırılır.

Komut: /usr/local/bin/composer self-update

Bu komut ile gerçekleştiriyoruz. Tüm composer komutlarını görmek için composer uygulamanızı terminalden çağırmanız yeterli olacaktır.

composer (veya composer.phar sizde yüklü olduğu şekilde) tüm komutlar listeleyecektir.

 

Php Dependecy İnjection Örnek Uygulama

Bir önceki yazımızda dependency injection hakkında temel bilgiler edinerek giriş yapmıştık. Burada ise php ile uygulamalı dependency injection kullanıyor olacağız.

Örneğimizde; bizim bir haber sitemiz var veya bir platformda haber içerikleri yayınlıyor olalım. Uygulamamıza haberleri ise anlaşmalı olduğumuz AA(Anadolu Ajansı) kurumundan aldığımızı varsayalım. İki çeşit veri alabilelim.

1) İstediğimiz adet kadar manşet haberleri alalım. getTopNews($top) methodu

2) Verdiğimiz haber id sinden haberin detaylarını alabilelim. getNewsDetail($newsId) methodu

 

Class AnadoluHaber
{
 public function getTopNews($top = 5)
 {
 // anadolu haber ajansından manset haberleri getir
 echo "AA haber ajansından gelen manşet haberler.";
 }
 
 public function getNewsDetail($newsId)
 {
 // anadolu haber ajansında yer alan haber detayını getirir
 echo "AA {$newsId} nolu haber detayı";
 }
}

// anasayfamizi temsil eden class
class MainPage
{
 public function showTopNews()
 {
 // anasayfamizda ust slider kisminda mansetleri gosterelim
 $haberAjans = new AnadoluHaber();
 $haberAjans->getTopNews();
 }
}

Çıktı: “AA haber ajansından gelen manşet haberler.” olacaktır. Yani AA haber ajansından gelen manşet haberleri listeliyor olacağız.

 

Birde haber detay göstereceğimiz sayfamızda yan tarafında manşetleri listeliyor olalım.

// haber detay sayfamizi temsil eden class
class NewsDetail
{
 private $haberAjans;
 public function __construct()
 {
// haber ajans class ini yukleyelim
$this->haberAjans = new AnadoluHaber();
 }
 
 public function getNewsDetail($newsId)
 {
 // haber detayini ajanstan alalim
 $this->haberAjans->getNewsDetail($newsId);
 }
 
 public function showTopNews()
 {
 // haber detay sayfamizin yan kisminda mansetleri gosterelim 
 $this->haberAjans->getTopNews();
 }
}

$detail = new NewsDetail();
// detay
$detail->getNewsDetail(1);
// Çıktı: "Anadolu H.A 1 nolu haber detayı"

// mansetler
$detail->showTopNews();Çıktı: "AA haber ajansından gelen manşet haberler."

Buraya kadar güzel anlaştığımız ajansa ait verileri uygulamamızda alıp gösterebiliyor işlerimizi görüyoruz. Yarın patron geldi artık CHA (Cihan Haber Ajansı) ile çalışmaya başlayacağız gerekli düzenleme ve çalışmalar yapılsın dedi. Evet bu demek oluyor AA ajansına ait yaptığımız çalışmalar geçersiz olacak. Buda demek oluyor ki AA class ını kullandığım her yerde bu değişiklik gerçekleşecek. İyi ama peki nerelerde kullanmıştık? Biz kocaman bir haber portalıyız hemen hemen her yer de kullanılıyor ama bu.Bunu kullanan tüm class ve alt class larda bu değişikliği nasıl yapacağız.Peki ne kadar vaktimiz var? Bu class ı geçen sene çalışan Ali abi yapmıştı ben içeriğini ve detay inceliklerini bilmiyorum ki nasıl çıkıcam bu işten? Gibi gibi bir ton sorular ve sorunlar oluşmaya başlayacaktır. Proje büyüdükçe bunların üstesinden gelmek zorlaşır ve hata yapmaya açıktır.

Diyelim ki yeni ajans yapısını da iyi kötü oluşturduk.

Class CihanHaber
{
 public function getTopNews($top = 5)
 {
 // cihan haber ajansından manset haberleri getir
 echo "Cihan haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // Cihan haber ajansında yer alan haber detayını getirir
 echo "Cihan H.A {$newsId} nolu haber detayı";
 }
}

Peki nerelerde değişiklik yapacağız şimdi? AA class ının olduğu her yerde. Yani ana sayfamızda ve haber detay sayfamızda tek tek bulup yeni class ımızla değiştireceğiz.

// anasayfamizi temsil eden class
class MainPage
{
 public function showTopNews()
 {
 // anasayfamizda ust slider kisminda mansetleri gosterelim
// $haberAjans = new AnadoluHaber();
 $haberAjans = new CihanHaber();
 $haberAjans->getTopNews();
 }
}
// haber detay sayfamizi temsil eden class
class NewsDetail
{
 private $haberAjans;
 public function __construct()
 {
// $this->haberAjans = new AnadoluHaber();
 $this->haberAjans = new CihanHaber();
 }
 
 public function getNewsDetail($newsId)
 {
 // haber detayini ajanstan alalim
 $this->haberAjans->getNewsDetail($newsId);
 }
 
 public function showTopNews()
 {
 // haber detay sayfamizin yan kisminda mansetleri gosterelim 
 $this->haberAjans->getTopNews();
 }
}

Projenizde bu sınıfı kullanan her yerde değişiklikleri yapmanız gerekir. Güzel değişiklikleri gerçekleştirdik oh be tamamdır diyoruz. Eskilerini açıklama satırı haline getirip kurtulduk. Peki ya yarın yine başka bir ajans ile anlaşılmak istenirse? Yine aynılarını yaparım vakitte alsa diyorsunuz. Bu böyle gider. Peki ya kurumunuz uygulamanızda köklü bir değişikliğe giderse. AB testleri gibi bir kısım kullanıcılara AA bir diğer kısım kullanıcılara CHA haberlerini göstermek durumları incelemek isterse. Nasıl hem AA hem CHA haberlerini gösterebilirim düşünmeye başlarsınız. Sonra yine pratik şekilde yol bulursunuz. Projeyi tekrar açarak 2 class ıda aynı şekilde farklı farklı çalıştırırım, her eklendiğinde aynı şekilde projeyi açar yeni kodları ekler çalıştırırım dersiniz.

$ajansAA = new AnadoluHaber();

$ajansCHA = new CihanHaber();

Her yeni eklendiğinde böyle uzar gider en son bir yerde daha çıkılmaz hal alabilir. İçlerinde geliştirmeler düzenlemeler yeni özellikler istenildikçe. Bu kaçınılmazdır. Kod tekrarları fazla yazılmış kodlar, geçen zamanlar, uygulama pratikliği, dinamikliği. OOP gücünden faydalanmayı bilmeliyiz. Bunun hem bize katkısı hemde işlerimize katkısı olacaktır.

Peki çözüm ? Dependency İnjection Nerede Ne Sağlar ?

İşte burada her özellik için(ajanslar) ayrı class lar yazılır. Ama bütünlüğü bozmamak için bu class lara kurallar getiririz. Yani bu class ta bu methodlar mutlaka olacak bunlarla çalışacağız ve çalıştıracağız. Buda eşittir İnterface demek. Her bir özellik sınıfımızda(Ajans) diğer sınıflar tarafından kullanılan çalıştırılacak ortak methodlar belirliyoruz. Sonra uygulamamız yükleme (veya ilgili yerde) aşamasında config (ayarlar) verinizden hangi özelliğin(ajansın) yüklenmesi gerektiğini görür ve ona göre uygulamaya o özelliği – yapıyı ekler. Böylece bu sınıfı kullanan her yerde isteğe göre seçilmiş olan yapının içeriği kullandırılmış olur. Yani ana sayfamızın class ı hangi haber ajansının yüklendiğini bilmez ilgilenmez sadece belirtilmiş methodu çağırır. Çağırdığı method yüklenen ilgili ajansa ait haberleri getirir. Böylece her sınıf sadece kendisi ile ilgilenmiş olup diğer sınıflara doğrudan bağlılığı kalmaz.

Uygulamamızı Dependency İnjection Şeklinde Yenileyelim

1) Öncelikle tüm özellik – yapılarımızda(Burada Ajans Class ları) ortak kulları belirleyelim. Yani interface arayüz tanımlayalım.

Interface IHaberAjans
{
 public function getTopNews($top);
 
 public function getNewsDetail($newsId);
}

Bu interface tüm haber ajanslarında implement olacak, böylece her ajansın yapısında getTopNews($top) şeklinde manşet haberlerini getiren ve getNewsDetail($newsId) şeklinde haber detaylarının getirildiği methodları barındırması zorunda olacak.

2) Yapılarımızı bu arayüzle güncelleyelim.

Class AnadoluHaber implements IHaberAjans
{
 public function getTopNews($top = 5)
 {
 // anadolu haber ajansından manset haberleri getir
 echo "Anadolu haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // anadolu haber ajansında yer alan haber detayını getirir
 echo "Anadolu H.A {$newsId} nolu haber detayı";
 }
}

Class CihanHaber implements IHaberAjans
{
 public function getTopNews($top = 5)
 {
 // cihan haber ajansından manset haberleri getir
 echo "Cihan haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // Cihan haber ajansında yer alan haber detayını getirir
 echo "Cihan H.A {$newsId} nolu haber detayı";
 }
}

3) Sınıfımızı kullanan diğer sınıflara yer verelim.

// anasayfamizi temsil eden class
class MainPage
{
 private $haberAjans;
 
 public function __construct($_newsAgency)
 {
 $this->haberAjans = $_newsAgency;
 }
 
 public function showTopNews()
 {
 // anasayfamizda ust slider kisminda mansetleri gosterelim
 $this->haberAjans->getTopNews();
 }
}

// haber detay sayfamizi temsil eden class
class NewsDetail
{
 private $haberAjans;
 public function __construct($_newsAgency)
 {
 $this->haberAjans = $_newsAgency;
 }
 
 public function getNewsDetail($newsId)
 {
 // haber detayini ajanstan alalim
 $this->haberAjans->getNewsDetail($newsId);
 }
 
 public function showTopNews()
 {
 // haber detay sayfamizin yan kisminda mansetleri gosterelim 
 $this->haberAjans->getTopNews();
 }
}

 

4) Config de hangi haber ajansını kullanacağımızı bildirelim.

$config = "AnadoluHaber";

Bu değer database den xml den veya projenizde bir değişkeniniz den sağlayabilirsiniz. Biz direk config deki isimden class türeteceğiz.

5) Ana sayfamız ve haber detay sayfamızdan bağımsız olarak config deki seçilen ajansa göre instance alacağız.

// Congig degiskeninde "AnadoluHaber" değeri vardı. Bu yüzden Anadolu Haber sınıfı yuklenecek
// Eger CihanHaber degeri verseydik CihanHaber class ı yuklenecekti
$haberAjans = new $config();

şimdi kullanan class lara enjekte edebiliriz.

// anasayfada gosterilecek manset haberleri haberAjansi degiskeninden alacak. Yani AnadoluHaber classı
$mainPage = new MainPage($haberAjans);
$mainPage->showTopNews();

Aynı şekilde bu classı kulanan haber detay sayfasına da enjekte edelim.

$detail = new NewsDetail($haberAjans);
$detail->getNewsDetail(1);
$detail->showTopNews();

Böylece anasayfa ve haber detay sayfası haber ajansı sınıfından bağımsız olarak çalışmaktadır. haber ajansı ayarlardan okunarak ilgili ajansı dahil eder ve gerekli yerlere enjekte eder. Bu sayede hangi ajans yüklenirse yüklensin bağımsız olarak methodlarımız çalışacaktır. AA ajansıda CHA ajansıda olsa manşet haberler çağrılacaktır.

Yani config değişkenini bu şekilde değiştirirseniz artık CHA ajansını kullanacaktır.

$config = "CihanHaber";

Peki ya eklenen ajans sınıfında bu method yoksa ne olacak?

İşte bu yüzden interface kullandık. Bu methodlar barındırılmasını zorunlu kıldık.

Dependency İnjection Sonuç: Dependency İnjection sayesinde artık her ajans değiştirdiğimizde uygulama kodlarını açıp eski methodları açıklama satırı haline getirmeyeceğiz veya kodlarda düzenelemeler yapıp tekrar uygulamayı hazır hale getirmeyeceğiz. Yapmamız gereken tek şey ayarlarımız da hangi ajansın çalışacağını seçmekten ibaret.

Uygulama çalışmaya devam ederken değişik yapabilme imkanı.

Bu sayede artık testler gerçekleştirebileceğiz çünkü sınıfların birbirleri ile arasında sıkı bir bağ yok hepsini bağımsız olarak çalıştırabiliyor olacağız. Testler yazılabilir.

Bu sayede modülerlik, yeni düzenlemeler hata yakalama, yeni yöntemlere geçişler, başka yerlerde kullanabilme gibi özellikler kazandırırız.

Dahası zaman, ve boşa gitmeyen emekler…

Kodların son hali ise:

<?php

Class AnadoluHaber implements IHaberAjans
{
 public function getTopNews($top = 5)
 {
 // anadolu haber ajansından manset haberleri getir
 echo "Anadolu haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // anadolu haber ajansında yer alan haber detayını getirir
 echo "Anadolu H.A {$newsId} nolu haber detayı";
 }
}

Class CihanHaber implements IHaberAjans
{
 public function getTopNews($top = 5)
 {
 // cihan haber ajansından manset haberleri getir
 echo "Cihan haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // Cihan haber ajansında yer alan haber detayını getirir
 echo "Cihan H.A {$newsId} nolu haber detayı";
 }
}

Interface IHaberAjans
{
 public function getTopNews($top);
 
 public function getNewsDetail($newsId);
}

// anasayfamizi temsil eden class
class MainPage
{
 private $haberAjans;
 
 public function __construct($_newsAgency)
 {
 $this->haberAjans = $_newsAgency;
 }
 
 public function showTopNews()
 {
 // anasayfamizda ust slider kisminda mansetleri gosterelim
 $this->haberAjans->getTopNews();
 }
}

// haber detay sayfamizi temsil eden class
class NewsDetail
{
 private $haberAjans;
 public function __construct($_newsAgency)
 {
 $this->haberAjans = $_newsAgency;
 }
 
 public function getNewsDetail($newsId)
 {
 // haber detayini ajanstan alalim
 $this->haberAjans->getNewsDetail($newsId);
 }
 
 public function showTopNews()
 {
 // haber detay sayfamizin yan kisminda mansetleri gosterelim 
 $this->haberAjans->getTopNews();
 }
}

$config = 'AnadoluHaber';
$config = 'CihanHaber';
$haberAjans = new $config();

$mainPage = new MainPage($haberAjans);
$mainPage->showTopNews();

$detail = new NewsDetail($haberAjans);
$detail->getNewsDetail(1);

 

Dependency İnjection Nedir? Php Örnek Kullanım

Yazılım geliştirme sürecinde en önemli konulardan biri şüphesiz yazılımın iyi tasarlanmış olmasıdır. Bu projenin geliştirilmesi yönetilmesi ve devamlılığı için çok önemlidir. Proje büyümeye başladıkça yeni ihtiyaçlar, yeni geliştirmeler, ekstra özellikler kazanarak devleşmeye başlar.

Büyük şirketler dahil çoğunlukla önce projenin hayata geçirilmesini isterler; şimdilik bu şekilde yapalım ilk versiyonu çıkartalım biraz ilerleyelim, ileride bunları raylara oturturuz gibi düşünceler yer almaktadır. Ancak iyi hazırlanmamış bir zemine sürekli yeni şeyler inşa etmek sallantılı bir süreç getirir. İlk zamanlarda problem yaşanmasa da ileride proje geliştikçe büyüdükçe ortaya çıkması kaçınılmaz olabiliyor. Ve ileride ya toparlanma zamanı hiç gelmez yada toparlamaya kalktığınızda işin içinden çıkamaz hale gelinebiliyor. Bazen yeni bir özellik eklemek projeyi yeniden yazmaktan daha zor olabiliyor bu sebeple. Bunların bir çok sebebi olmasına karşın bugün bizim konumuz olan çözüm dependency injection.

Dependency injection: bağımlılıkların dışarıdan enjecte edilmesi anlamına gelir.

Yani nedir; yazılımı oluşturan yapıların birbirleri ile olan bağı en aza indirmek. Buna loosely coupled-Gevşek bağlılık denir.

Dependency İnjection Ne Sağlar

Yazılımı oluşturan yapıların birbirleri ile olan sıkı bağ azaldığı için, uygulamaya yeni özellikler eklenip çıkartılabilmesi kolay hale gelir.

Uygulama içerisinde değiştirilmesi müdahale edilmesi gereken yerler minumuma iner.

Test edilebilir yapılar ortaya çıkar.

Özellikler bir yerde

Örnek Seneryolar

Bir çok örnek durum gösterilebilir şuan aklıma gelen bir kaç tanesini paylaşmak istedim. Örneğin birden çok ödeme sistemi var, ileride bunlardan bir tanesini daha projenize dahil edeceksiniz. Müşteriniz bugün mail yoluyla çalışan bildirim sistemini  yarın sms olarak kullanmak istiyor. Bugün a sistemine göre uygulamanızı tasarladınız yarın yeni versiyon veya b ye geçilmek istendi, bugün google dan verileri alıyorsunuz yarın bir müşteriniz yandex tercih edebilir. Yeni bir özellik eklenti geliştirdiniz test etmek istiyorsuuz. Gibi durumlar çoğalabilir.

Uygulamanızı bugün x şirketinin talepleri doğrultusunda google dan verileri alıyor şekilde tasarladınız. Yarın başka bir kurum – müşteri ile daha anlaştınız. Ama bu müşteri benim yandex ile anlaşmam var verileri oradan almamız gerekiyor dedi. Tamam dediniz iyi kötü if ler havada uçuşarak entegre ettiniz. Yarın müşteri dedi ki bizim anlaşmamız bitti artık yahoo ile çalışıyoruz. Ne oldu tekrar baştan aşağı uygulamayı ele alıp kodlarda bir çok değişiklik gerçekleştireceksiniz. Sonra başka müşteri tekrar google verileri ile çalışmak istedi. Ne ya yapacaksınız, tamam bunu daha önce yapmıştık der değişikliğe gidersiniz.

Fonksiyonel veya oop yaptınız. Güzel. Diğerlerini o yüzden commentleyip geçerim

google(); // sen calis

// yandex(); // sen calisma iptal

// yahoo(); // sen calisma iptal

Böyle durumlarda her yeni özellik eklenmek değiştirilmek istendiğinde uygulamanın kodları açılır ve her ilgili methodu,sınıfı içeren yerlerde tek tek değişiklik gerçekleştirilir veya commentlenir. Proje tekrar derlenir veya hazırlanır teslim edilir. Her yeni özellik veya geliştirmede bu işlemler tekrarlanır. Bu istenen bir durum değildir. Zaman ve yoğun emek gerektirebiliyor.

Oysa birbirinden bağımsız şekilde tasarlanan class yapılar ile bunu gerçekleştirmek çok daha kolay ve modülerdir. Burada önemli olan yazılımı oluşturan her bir yapının sadece kendisine ait işlemleri gerçekleştiriyor olması ve diğer bileşenlerle ilgilenmemesi yani bağımlı olmamasıdır. Her bir yeni geliştirme veya özellikte ona ait bir yapı(class) oluşturulur. Çalışma esnasında ise seçime bağlı olarak ilgili özelliğe ait olan yapı uygulamaya dahil edilir ve kullanılır.

Yani config de bakılır google mı yandex mi yahoo mu ne kullanılıyor ise ona ait class uygulamada ilgili yerlere enjecte edilir. Böylece enjekte edilen class lar gelen google mı, yandex mi yahoo mu bilmeden hangisi gelirse gelsin ilgili methodu (örneğin getData) işler.

En Basit Anlamıyla Dependency Örneği

Örneğin bir user class ımız var. Burada kullanıcı ile ilgili işlemler yapıyoruz. Ekle, sil, detay vs. Ve bu işlemler için log tutmak istiyoruz. Hemen user class ımız içinde log class ı ile bağlantı kurarız dimi ?

Örnek:

Class User
{
 public function add()
 {
 ...
 // iste burada Log class ına cok bagimli olduk
 $log = new Log();
 $log->add($userData);
 }
}

İşte user sınıfımızda log class ına bağlı kaldık. Burada Log sınıfı olmazsa User sınıfı çalışamıyor yani log sınıfına bağlı. Bu bağlılığı nasıl azaltabiliriz.

Class User
{
 public Log;
 
 public function __construct($log)
 {
 $this->Log = $log;
 }
 
 public function add()
 {
 ...
 // artık log disaridan enjecte ediliyor, bagimlilik azaldi
 $this->Log->add($userData);
 }
}

$log = new Log();
// user class ına disaridan enjekte ediyoruz
$user = new User($log);

Görüldüğü üzere User class ı başlamadan önce oluşturulan log classı user class ına dışarıdan veriliyor. Böylece user sınıfı log sınıfını bilmek zorunda değil. LogSms, logMail,logFile gibi yeni class lar da oluşturulup verilebilir. Ama user sınıfı hep aynı işlemi yapar, gelen log sınıfının türünü bilmez sadece add methodunu çağırır. Yani tek config de işi bitiriyor oluyoruz.  Oysa biz dependency injection kullanmasaydık ve log sınıfını bir müşterimize göre sms olarak çalıştırmak iseteseydik, log sınıfını kullanan tüm sınıflarda tek tek bulup yerine new LogSms() yazacaktık.

Umarım giriş anlamında bir şeyler şekillenmiştir. Şuan karmaşık gelebilir örneğimizde detaylı uygulamalı göreceğiz

Php ile Dependency İnjection Örnek Uygulama

Php base_convert Fonksiyonu

Php base_convert Fonksiyonu

Php nin en güzel yanlarından biri neredeyse her konuda bulabileceğiniz fonksiyonlar barındırması. Şüphesiz bir çok işimize yarayacak fonksiyon ile bize hem kolaylık hem vakit kazanımı sağlar. Geçenlerde bir iş geliştirirken karşıma çıkan az bilinen base_convert fonksiyonuna yer vermeyi düşündüm.

Nedir base_convert Fonksiyonu

Bu fonksiyon matematiksel olarak verilen sayıyı sayı tabanlarına çevirme işlemleri yapar. Yani taban çevirme işlemlerini kolayca yapabiliriz. 2 ile 36 arasında sayı tabanları ile çalışır. base_convert Php

Kullanımı base_convert Fonksiyonu

string base_convert ( string $numberint $frombaseint $tobase)

1.parametre: çevrilmesi istenen sayı

2.parametre: sayının hangi tabanda olduğu

3.parametre: sayının çevrilmesi istenen sayı tabanı

string base_convert ($cevrilcekSayi, $bulunanTaban, $cevrilecekTaban)

Örnek Kullanım

Örneğin 10 luk tabanda olan 5 sayısını 2 lik sayı tabanına çevirelim.

<?php

$sayi = 5;

echo base_convert ($sayi, 10, 2);

// çıktı: 101

?>

Aynı şekilde tam tersini yapalım sağlayalım:

<?php

$sayi = 101;

echo base_convert ($sayi, 2, 10);

// çıktı: 5

?>

Nerelerde Kullanabiliriz

Taban çevirme ihtiyacı dışında örneğin database de tablonuzda ki bir sayısal ID alnına ait mini şifrelenmiş bir generete kod oluşturmuş olursunuz. Veya kendi şifreleme işlemlerinizde bir alt parçası olabilir. Gibi hayal gücüne kalmış ihtiyaca göre modifiye edilebilir. Benim ilk söylediğime yakın bir örnekte ihtiyacım olup kullanmıştım. Faydası olması dileği ile

Php İle Uygulama Geliştirirken Bilmemiz Gerekenler

Php İle Uygulama Geliştirirken Dikkat Edilmesi Gereken Bilgiler

Php ile web uygulamarı geliştirirken bir takım dikkat etmemiz gereken hususlar vardır. Php baz alınarak anlatılan bu yazıda aslında bir çok durum, genel web uygulamaları geliştirmede geçerli olan pratik bilgilerdir. Her geliştiricinin dikkat etmesi gereken pratik bilgilerin yer aldığı yazıyı inceleyelim.

Paylaşarak diğer geliştiriciler için de katkıda bulunalım.

1) Başarılı Bir POST İşleminden Sonra Sayfayı Yönlendirin

Sadece php için geçerli değildir. Web uygulamalarında kullanıcı form bilgilerini doldurup post eder. Post ile aynı sayfaya veriler gelir. Kullanıcı sayfayı yenilediğinde aynı formu aynı dataları tekrar sayfaya post eder. Sayfayı yenilediğinde bu uyarıyı yapan bir alert penceresi ekrana gelir zaten. Bu sorunu eminim bir çok kişi yaşamış veya başka uygulamalarda görmüştür diye düşünüyorum.

Hemen test etmeniz için aşağıdaki gibi bir php sayfası oluşturun. Örnek olarak index.php dosyasına aşağıdaki kodları ekleyip browser da test edin.

index.php:

<form method="POST" action="index.php">
<input type="text" name="firstName" value="Tahsin">
<input type="submit" name="submitBtn" value="Gonder">
</form>

<?php
print_r( $_POST );
?>

Localhost dan ilgili sayfayı açıp sayfayı post ettiğinizde(Gönder butonuna bastığınızda) sayfanın post edildiğini aşağıda gelen dataların ekrana bastırıldığını göreceksiniz. Tekrar sayfayı yenilediğinde ise ekrana bir uyarı geleceki tamam dediğiniz takdirde aynı form bilgileriyle sayfa tekrar post edilecektir. Bu uygulamanıza göre sorun yaşatabilir ve istenmeyen bir durumdur. Örneğin kullanıcı bilgilerini güncellediğiniz veya kullanıcının mesaj gönderdiği form olarak düşünün, bilgiler sürekli insert veya update edilecektir.

Bunun için işlem sonucunda sayfayı yönlendirmeniz bu sorunu çözecektir.

if($success){
    header('Location: page.php?msg=success');
    exit;
}

2) Mysql_ * Fonksiyonlarını Kullanmaktan Vazgeçin

Php kendi sitesinde de duyurduğu üzere artık bu fonksiyonlara destek verilmeyecek PHP 5.5 de resmen kaldırıldığı ilan edilmiştir. http://tr1.php.net/manual/en/function.mysql-connect.php . Bu fonksiyonlar nedir

mysql_connect, mysql_query, mysql_fetch_array vb.

Bu eski emektar yapının köklü ve ihtiyaçlara uygun modern şekilde daha çok işimize yarayacak yapılarla tanışma vaktimizin geldiğini gösteriyor. Bunun için alternatiflerimiz: PDO (Php Data Objects), Mysqli (Mysql Improved Extension)

PDO ile tanışıp incelemenizi, devam etmenizi öneririm.

3) Php Etiketlerini Kapatmayın

Geliştiriciler genellikle php dosyalarının sonunda php etiketini kapatırlar. Bu bazen anlam veremediğimiz boşlukların olmasına sebebiyet verebiliyor.

<?php
class MyClass{
    public function test(){
        //code ...
    }
}

?>
Bunun yerine aşağıdaki gibi kullanmak tercih edilir.
<?php

class MyClass{
    public function test(){
        //code ...
    }
}

4) XSS İçin Koruma

XSS (Cross Site Scripting) bir güvenlik açığıdır. İstemci tarafında javascript kodlarının çalıştırılmasını sağlar. Önemli bir konudur çok kullanılan ve zafiyet taramalarda ilk başvurulan yöntemlerdendir. Güvenli uygulama geliştirmeye özen gösterip tedbirler almak zorundayız. Daha fazla bilgi için wiki.

Bunu önlemek için kullanıcıdan gelen verileri filtreden geçirmemiz gerekiyor. Bunu her zaman yapmalıyız kullanıcılarımız her zaman iyi niyetli olmayabilir unutmayın. “htmlspecialchars” ile ekrana bastırılacak olan verinin işlevini kaybederek sadece yazı olarak gösterilmesini sağlar. Html etiketleri önceden tanımlanmış özel biçimlere dönüştürülür. Yani yazılacak data  sadece metin olmuş olur, javascript, html komutlarını işlevsiz kılar.

echo htmlspecialchars($userComment, ENT_QUOTES, 'utf-8');

5) Echo İle Tüm HTML Çıktılarınızı Basmayın

Bu benimde dikkat ettiğim kaçındığım ama gördüğüm kadarıyla çoğu zaman karşıma gelen bir durum. Yakın zamanda çalıştığım firmada yapılmış bir program üzerinde geliştirmeler yapmam gerekti. Html ile php birbirlerine girmiş havalarda uçuşan kodlar düşünün. Tüm sayfaların çıktılarının hatta projenin sırf echo ile yapıldığını hayal edin. Bu yine iyi bir seneryo peki ya o kodlar içinde hiç hata ayıklamayı aradığınızı hemen bulmayı düşündünüz mü? Bu çok sıkıcı ve vakit alıcı bir durum. IDE niz bile size çok yardımcı olamaz sağladığı özelliklerden yararlanamayabiliriz. Tasarımcı açısından da düşünün, php kodlarıyla çok uğraşmak zorunda da değil, içine girdiğinde aramakla 2 kat uğraşmakla işten çok çabuk sıkılması normal. Echo ile html basmayın demiyoruz, yerinde ve uygun şekillerde minimum düzeyde kullanmanız önerilir. MVC freamworkler kullanarak veya kendi yapılarınızı geliştirerek View dosyalarınızı ayrı tutmanız daha yararlı olacaktır.

6) Tekrar Etmeyen Kodlar Geliştirin

Uygulamanızı mümkün olduğunca mantıklı işlevsel parçalara ayırarak geliştirin. Aynı kodu bir çok kez yazmaktan kurtulun. Bunları include, class, function gibi yöntemleriyle halledebilirsiniz. Örneğin her defasında kullanıcı bilgilerinin kontrolünü sağlayan kodları yazmak yerine bir fonksiyon oluşturun, gerekli yerlerde bu fonksiyon sayesinde işleminizi rahatça yapabilirsiniz. Yarın bir gün abi kullanıcının seri no sunun kontrolünde şu bilgileri de ekleyelim dendiğinde tüm sayfalarda değişiklik yapmak zorunda kalmazsınız. Gider ilgili fonksiyonda değişikliği yapar kurtulursunuz.

7) Güvenlik Güvenlik ve Güvenlik

Uygulamanızda güvenlik göz ardı edilmemesi gereken en önemli konuların başında gelir. Bugün daha uygulama yeni gelişiyor çok büyük kullanıcı kitlemiz yok ilerde düşünürüz, kullanıcı profilimiz belli sorun olmaz, uygulamanın bu bölümünde güvenliğe bu kadar düşmemize gerek yok gibi göz ardı ettiğiniz şeyler gelecekte çok canınızı yakabilir.

Uygulama geliştirmede güvenliği hep düşünerek kod yazmak uygulamayı en baştan bu şekilde geliştirmek çok sağlıklı olacaktır.Bunu kendinize felsefe edinmenizi öneririm bu kendinizi de uygulamanızı da geliştirecektir.

Kullanıcılara güvenmeyerek uygulama geliştirmek gerekiyor. Bu kötü bir şey değil. Siz bütün kullanıcılarınıza tam güvenirsiniz ancak 1 kullanıcı gelir onu diğer kullanıcılarınızdan ayırt edemezsiniz ve çalışan sisteminizi de diğer kullanıcıları da üzebilir.

Tüm kullanıcı veri girişlerini, veri çıkışlarını filtrelemek, uygulamanızı itinayla bozmaya çalışmaktan denemeler yapmaktan güvenlik taramalarından ve gelişmeleri takip etmekten kaçınmayın.

8) Döngüler İçinde Sorgular Çalıştırmayın

Dögü içinde yaptığınız işemlere dikkat edin. Mümkün olduğunca optimize edin. Farkında olmadan yazdığınız kodlar sistemi gereğinden fazla yorar meşgul eder. Döngü içinde database işlemlerinden kaçınmaya çalışın.

9) Database Güvenli Veri Ekleme

Nasıl ki istemci tarafında kullanıcı verilerini XSS için etkisiz kılıyorsak aynı durumun veri tabanı versiyonu da var. Yani veri tabanına gelecek verilerinde kontrolden filtreden geçirerek SQL Injection saldırılarından korumamız gerekir. Bunun için alışagelmiş mysql_real_escape_string olsa da yeterli değil. Peki ya ne gerekiyor? PDO, Mysqli gibi yeni yapılar kendi güvenli yöntemlerini sunuyor. Örneğin PDO için:

<?php
//Sql sorgu yapısı olustur
$stmt = $db->prepare("SELECT name FROM users WHERE username = :username");
 
//Olusturulan sorgu yapınıza ait parametreleri degerlerini ekleyin
$stmt->bindParam(':username', $username);
 
//Islemi calistir
$stmt->execute();

Ayrıca kullandığımız hemen hemen tüm freamworkler güvenlik açıklarına karşı geliştirilip gerekli önlem mekanizmaları sağlamaktadır.

10) Her Olumsuz Durumda “die()” Kullanmayın

Bir çok geliştirmeler de olumsuz durumlar için die, exit gibi uygulamayı bitirici işlemlerle sonlandırırız. Bu iyi bir kullanım değildir, tabi uygulamanızın ve kodların yapısına göre değişebilir. Mümkün olduğunca hataları yakalamayı onları yönetmeyi bilmemiz gerekiyor. Hatalardan böyle kaçamayız. Hataları yakalayarak kontrol etmeyi, log tutma gibi, aynı zamanda uygulamanın çalışmasını sonlandırarak değil bunu uygun şekilde uygulama çalışmaya devam ederken işleyip gerekli bilgi mesajları vererek halletmemiz daha uygun olacaktır.

11) Doğrulama İşemleri

İllaki her uygulamamızda doğrulama işlemlerine ihtiyaç duymuşuzdur. E-mail olsun, sayı ve metin gereken alanlar olsun. Bunlar için hemen devede pire aramayın. Her şey için regex kullanmaktan, internette aramaktan, kendiniz geliştirmekten vazgeçin. Bu maliyetli bir iştir. Hem kendiniz hem projeniz için. Hemen yanınızda duran var olan fonksiyonları inceleyin. Dile hakim olun. “filter_var” keşfedin. Örneğin email kontrolü için:

if(!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
 //gecersiz email
}

12) Php Kısa Etiketler

Benimde aslında sık kullandığım kısa etiket yapısı içinde bir uyarı var. Bazı sunucularda php kısa etiket kullanımı kapalı olabilir. Bunda ne var diyorsanız: sunucu bize ait değilse, veya yaptığımız uygulamayı dağıtmayı düşünüyorsak küçük görünen bu sorun büyük bir dert olabilir. Bunu düşünerek kaçınmamızda fayda var bende kendime alıştırcam bunu:) Yani:

<?= $degisken ?> yerine <?php echo $degisken?> kullanılmalı.

Php.ini de “Short Open Tag” satırını bularak “on” açık hale getirebiliriz.

13) Optimizasyonlar

Gözden kaçırdığınız yada bundan bir şey olmaz dediğiniz yapılar proje geliştikçe damlaya damlaya göl olur misali uygulamanıza zararı dokunur. Örneğin bir fonksiyonu aynı işlemi aynı değerlerle birden fazla çağırıp kullanacaksanız dönen değerini bir değişkende tutup onu kullanmanız, fonksiyonu tekrar çalıştırmaktan daha verimli olacağı çoğu zaman göz ardı ediliyor.Çok basit bir örnek:

for($i = 0; $i < count( getUsers() ); $i++){
 // islemler
 }

Burada getUsers adında bir fonksiyon var. Buradan dönen kayıtların sayısı kadar çalışacak döngü hazırlanıyor.Buraya kadar güzel. Peki ilerleyen satırlarda bizim yine aynı kullanıcı bilgilerine (getUsers fonksiyonundan dönen değerlere) ihtiyacımız var ve kullanıyorsak? Örneğin:

$users = getUsers();
echo "İlk kullanıcı" . $users[0];

İşte o zaman sorun. Çünkü getUsers fonksiyonu tekrar gidip çalışacak sonuç üretecek tekrar değerleri geri return edecek. En başta bir değişkene sonuç alınır bu değişken üzerinden işlemler gerçekleştirilirse daha performanslı ve uygun olacaktır. Çok büyük değer var değişken ile boşuna bellek kullanayım diyorsanız da unset ile bellekten silebilirsiniz değişken ile işiniz bitince

$users = getUsers();
...
for($i = 0; $i < count( $users ); $i++){
 // islemler
 }
...
echo "İlk kullanıcı" . $users[0];
unset($users);

14) Veritabanı Normalizasyonu

Hemen hemen tüm uygulamalarımız veri tabanı gerektiriyor en azından çoğunluğu. Bu veri tabanıyla içli dışlı olmamızı gerektirir. Çünkü burada hazırlanan yapı, tasarım uygulamamızın tüm geleceğini etkileyecektir. Uygulamamız bu yapıya göre çalışacak, kontrollerimiz, sorgularımız buraya göre şekillenecektir. Doğal olarak verimliliği, performansı, işleyişi de derinden etkileyecektir. Gereksiz yapılar, datalar, yanlış tasarımlar hem uygulamanızı etkileyecek hemde maliyetlerinizi arttıracaktır.

15) Standartlarda Kod Geliştirin

Buda çoğu zaman gözden kaçan dikkat edilmeyen bir sorundur. Dikkat edildiğinde ise tadından yenmez. Benim içinde çok önemli olup uymayanların arkasını toplamak zorunda kalabiliyorsunuz. Kabul görmüş kod standartları vardır PSR-0, PSR-1, PSR-2 gibi.PSR(Php Standards Recommendation – Önerilen PHP Standrtları) Bu gibi kabul görmüş global standrtlarda kod geliştirirseniz her yerde kolayca anlaşabilirsiniz. Dünyanın diğer ucundaki bir programcı da gelir kodlarınız anlar, sizde onların ne yapmak istediğini anlayıp anlaşabilirsiniz. Global olarak uygulama geliştirmiş olursunuz her kes tarafından anlaşılır kabul görmüş standartlarda ve kalitede.Kullandığımız freamworkler de yine bu standartlar doğrultusunda geliştirilir. Örneğin laravel psr kod standartlarını ve diğer bazı standartlar ile geliştirilmiştir.

En azından kendinizin bile standartları olmalı. Bu kod okunurluğundan birlikte grup çalışmalarına kadar faydası olacaktır. Hem kendinizin hem projenizin kalitesi artar.

PHP Framework Interop Group tarafından kurallar ortaya koyulmuştur. Bu gruba bir çok freamwork ve üye destekleyicisidir. Php-fig adresinden bu standartları inceleyebilirsiniz.

 

Yazıyı daha da uzun tutmamak adına burada ara vermiş olalım. Yazı serisi şekilde devamını getirmeyi planlıyorum. Diğer yazılarda da önemli bilgiler edinecek, unuttuklarımızı hatırlatacak, bildiklerimizi pekiştirecek, projemize ve kendimize kaliteli değerler katacağını düşünüyorum.

Laravel Nedir ? Başlangıç

Laravel Nedir ?

Laravel ihtiyaç duyulan, gelişmiş bir çok özellik ve yapıyı üzerinde barındıran, PHP ve OOP tüm nimetlerinden yararlanan, web uygulamaları geliştirmeyi sağlayan açık kaynak PHP freamwork’ tür.

“WEB SANATÇILARININ PHP FRAMEWORK’Ü” sloganıyla kendisini özetler ve hakkını verir:)

 

Laravel Özellikler

Yapısı gereği gerçekten çok sade ve temiz kod yazarak istediğiniz uygulamaları geliştirme imkanı verir.

Söz dizimi çok basit ve anlamlıdır. Alışmak için zorlanmazsınız, çabuk öğrenilebilir.

Bir kaç işlem barındıran küçük uygulamalardan, büyük kurumsal projelere kadar her türlü web uygulamasını tasarlama esnekliğine sahiptir.

OOP ve PHP nin tüm nimetlerinden yararlanır böylece güncel php özelliklerinde oop uygun şekilde çalışırız.

 

Diğer Laravel’i laravel yapan özellikler:

ORM:

ORM Nedir önce onu açıklarsak; (Object Relational Mapping) Database ile uygulamamızda (Object-Oritented) nesnelerimiz sayesinde bağlantı kurup yönetmemizi sağlayan bir yapıdır. Klasik SQL cümleleri yazmadan nesnelerimiz üzerinden veri tabanına erişim sağlayıp kontrol edebiliyor sorgular çalıştırabiliyoruz. ORM database den bağımsız çalışır. Yani Mysql, SQLite, postgresql, MSSql, Oracle gibi bir çok database için aynı kodları kullanırsınız. Bir çok avantajı var ama burada değinmeyeceğiz.

Laravel Eloquent ORM kullanır. En gelişmiş Active Record uygulamasıdır.

class Message extends Eloquent {}

$message = Message::find(1);

 

Gördüğünüz gibi çok basit kullanılabilir bir yapısı vardır. Sizi bir çok tanımlama yapmak uzun cümleler yapılar kurmaktan kurtarır.

Messages (“s” Siz table belirtmez iseniz çoğul hali olan “s” takısını ekleyerek database de tablo seçer) tablosundan id = 1 olan mesajı getirir.

 

Blade Template

Blade adı verilen template engine sahiptir. Uygulamanıza yine çok kolay ve sade şekilde arayüzle bütünleştirebiliriz. Öğrenilmesi yine kolaydır,temiz ve dinamik arayüzler hazırlayabilirsiniz html ve php kodları içinde savaş vermezsiniz.

 

Route:

Müthiş bir route (yönlendirme) mekanizması vardır. Yorulmadan temiz URL elde eder api ler için uygun erişim yönlendirmeleri yapabilirsiniz. Php yapısında yabancı olmadığınız şekilde.

 

Route::get('users', function()
{
   return 'Users!';
});

Burada ister yönlendirmelerinizi yapabilir ister filtrelerden kontrollerden geçirebilir ister Controller class larınıza yönlendirebilirsiniz. Hatta burada bu fonksiyonda uygulamanızın gerçekleştireceği işlemleri dahil controller class lara gerek kalmadan gerçekleştirebilirsiniz. (Önerilmez)

 

Migrations (Sürüm Kontrolü, Göçler)

Veri tabanı sürüm kontrol sistemidir. Artisan Komut Satırı ile uygulamanızın veritabanına şemalar ekleyebilir düzenleyebilirsiniz. Veri tabanı yönetim sistemine gitmeden sisteminizdeki veritabanınızı oluşturmaya yada güncellemeye yarayan yapı. Örneğin uygulamanızı başka bir ortama taşıdınız, veri tabanını oluşturmaya çalışmaktansa uygulamanızda ki hali hazırdaki yapıyı çalıştırarak sistemi hazır hale getirmiş oluyoruz.

 

Unit Test (Birim Test)

Uygulamanızı test etmek için birim testler oluşturup çalıştırmamızı sağlar. Artisan komut satırıyla hazırladığımız testleri çalıştırabiliriz.

 

Automatic Pagination (Otomatik Numaralandırma)

Laravel bizim yerimize sayfalama sistemini düşünmüş ve bizi zahmete sokmadan el atmış. Kolay şekilde kullanabilir istersek değiştirebiliriz.

 

Modüler paket yönetimi ve composer

Composer, uygulamanızın üçüncü parti paketlerini kontrol edip hızlı şekilde ekleyip yönetmeyi sağlar. Composer ile bağımlılıklarınızı paketlerinizi dert etmez tek tek uğraşmak yerine çok kolay bir şekilde dahil edebilirsiniz.

 

Performans; Cache mekanizmaları sunar. Redis ile bütünleşmiş bir yapısı var adeta evlat edinmişcesine sahip çıkar, bünyesine katmıştır. Projenize redis dahil etmek için ekstra uğraşmanıza gerek yoktur.Çok hızlı ve basit şekilde yapılandırabilirsiniz.

 

Dahili olarak auth, filter gibi bir çok yapıyı içinde barındırıyor. Bunu yine kendi yapısına uygun ve basit şekilde sunar. Hemen hemen her uygulamada auth mekanizması olur ve bunu yapmak için ekstra çabaya gireriz. İşte laravel bunu da pas geçmemiş çok güzel bunun gibi yapılarda sunmuş.

 

Bir çok Symfony bileşeni üzerine kurulmuştur.

 

Güvenli, hızlı, sitenizi ayağa kaldırmak çok kolaydır.

 

Tek komutla sitenizi aktif hale veya yapım aşamasına alma gibi seveceğiniz bir çok özelliği daha mevcuttur.

 

Topluluk

Bir yapıda en büyük özelliklerden birisi de bana göre topluluktur. Başınız sıkıştığında yardım alabileceğiniz, danışacağınız, müthiş örnekler ve çözümler bulabilmeniz gibi bir çok yardımı dokunur.

Çok hızlı büyüyen topluluğa sahiptir. Henüz genç bir freamwork sayılır. Bu sebeple örneğin bir codeigniter kadar topluluğa ve aşinalığa sahip değildir. Ancak çok hızlı büyümektedir. Popülerliği her geçen gün artmaktadır. Türkiye ‘ dede kabul görmüş hızla atan bir kitlesi var, ayrıca iş ilanlarında da laraveli görmek mümkün. Türkiye’ de Sinan Eldem’ in çok iyi çalışmaları var. Katkılarından dolayı kendi adıma da teşekkürü borç bilirim. çok iyi bir Türkçe döküman hazırlanmış. Ayrıca resmi sitesinde , yerli ve yabancı forumlarına yine ulaşabilirsiniz. Ulaşmakla yetinmeyip sizde katkıda bulunursanız çok daha başka güzel olur:)

Döküman sıkıntısı yaşamaz, çok kısa zamanda öğrenebilir yardımlar alabilirsiniz.

 

Laravel ile Yapılan Siteler

Laravel ile oluşturulmuş uygulamaların yer aldığı http://builtwithlaravel.com/siteden gerçek çalışmalara göz atabilirsiniz.

 

Sunucu Gereksinimleri

PHP 5.3.7 ve üzeri sürümler
MCrypt PHP Eklentisi

Gereklidir.

 

Laravel Kurulum

Composer ile kurulum için:

composer create-project laravel/laravel laravel-test-proje1 --prefer-dist

Bulunduğunuz dizinde “laravel-test-proje1” klasöre laraveli indirip kuracaktır.

Github – Git ile Kurulum

Github adresi: https://github.com/laravel/laravel

Git clone: https://github.com/laravel/laravel.git

Kurulum yapmak istediğimiz dizine gelerek

$ git clone  https://github.com/laravel/laravel.git

ile git reposundan kendi localimize çekiyoruz. Sonra composer ile laravel in bağımlılıklarını yüklememizi sağlar.(Biliyoruz ki artık composer kullanıyoruz laravel bağımlılıklar, paketler için)

composer install

Evet laravel freamwork edinmiş olduk artık. Sunucunuzdan laraveli indirdiğiniz dizine gelirseniz, public klasöründe laravel in çalıştığını görürüz. Bizi laravel logosunun karşlıladığı bir sayfa görüyorsak her şey yolundadır.

Benim örneğimden “http://localhost/testLaravel/” girdiğimde laravel dizinleri gösterilir.

laravel dizini

laravel dizin yapısı

Public klasörüne girdiğimizde laravel varsayılan karşılama sayfası açılır. Laravel varsayılan olarak public dizininde çalışmaktadır.

Not: sunucunuzun “app/storage” dizinine  yazma izni vermemiz gerekebilir.

 

Laravel nedir, özellikleri nedir, neden laravel, laravel nasıl kurulur gibi temel bilgileri edindik Sonraki yazılarda laraveli detaylı işleyip uygulamalar geliştireceğiz. Şahsen kendi projelerim ve profesyonel hayatta da etkin şekilde kullanacağım )

Tavsiyem:

Hangi freamwork iyidir, hangi freamwork onu döver gibi konulara girmeden sadece laravel açısından kendi gözlem ve önerilerimi aktarayım. Ancak freamwork karşılaştırmaları avantaj, dezavantajları alternatifleri, kullanım alanları gibi bilgilerin olacağı başka bir yazıya yer verebiliriz.

Gerçekten öğrenilmesi kolay, söz dizimi, yapısı, basitliği kodlarla sanat yapar gibi çalışmanıza imkan vermesiyle kendisine bağlıyor mest ediyor. Çalışmaktan mutluluk duyuyorsunuz. Projenizde her şey düzenli, yerli yerinde oluyor. Yapının içinde boğulmuyorsunuz aradığınızı buluyorsunuz. Kodlar sizinle konuşur gibi olduğu için dilinden anlıyorsunuz:) Geri döndüğünüzde abi burada ne yapmıştım demiyorsunuz(tabi yinede geliştirmenize göre değişebilir) 🙂 Dahili bir çok yapı bulundurmakla kalmıyor bunları karmaşadan ve  hantallıktan uzak şekilde sunuyor. Auth, Redis bunlardan sadece bazıları. Projenizi çok kısa zamanda ayağa kaldırır vakit kaybetmezsiniz. Eski usul kod geliştirmeyi unutur modern kabul görmüş programcılığa adım atarsınız. ORM, OOP, Template Engine,Redis,Composer,Unit Test vb yapılara aşina olursunuz.Artılarını çok yakından hissedersiniz. Uygulamanızı kısa zamanda ayağa kaldırır, her uygulama geliştirmede alt yapılar oluşturmak zorunda kalmazsınız. Her şey çok basit çok yalındır. Düşündüğünüz bir çok şey etrafında toplanmıştır.

En azından denemenizde göz atmanızda fayda olacağını düşünüyorum. Bir başlarsanız daha tadından yenmeyeceğini fark eder tavsiyelerime katılırsınız 🙂