Neden Laravel?
Neden Laravel?

2018'den beri Laravel ile projeler geliştirmekteyim. Laravel'e geçiş yaptığımdan beri eskiden yazdığım kodların çok düzensiz olduğunu, güvenlik açığı bıraktığını ve geliştirmeye kapalı olduğunu görmekteyim. Laravel ise tam tersine bu eksiklerimi giderip üstüne bir takım paketler sunarak işimi daha iyi ve zevkle yapmamı sağlıyor. 

Öğrenmesi Kolay

Uzun yıllardır kullanıldığı için zaten internet Laravel yazıları ve videoları ile dolu fakat çoğu zaman Laravel dökümanı bile hepsinden daha anlaşılır. Adım adım yapılması gerekenler ve bir konuda en temel yapılar örneklerle dökümanda mevcut. Eğer çok detaylı bir şeye ihtiyacınız varsa API dökümanına bakabilirsiniz. Laracast'de ücretli ve ücretsiz seriler mevcut.

Güçlü bir yapı

İlk kurulumla beraber boilerplate bir kod sunuyor ve neyi nerden yapacağınız her zaman belli.

Sunduğu özellikler: 

Artisan Console

Cli desteği ile bir satır komutla ihtiyacınız olan önceden tanımlanmış class'ları ilgili klasörlere oluşturabilirsiniz. Örneğin php artisan make:model Post -a komutu ile Post adında bir model ve bu model (ilgili tabloya ait class), için migration (tabloyu oluşturmak için gerekli class), Seeder ve Factory (Örnek db verisi oluşturmak ve yüklemek için gerekli classlar), controller (veriyi routedan alıp işleyip client'a bir view veya json olarak çıktı vermek için gerekli class) oluşmaktadır.

Routing

Laravel uygulamasında tüm istekler public klasöründeki index.php'den başlar. Böylece hem sizin belirlemediğiniz bir dosya asla çalışmayacaktır hem de SEO destekli URL'leri çok rahat oluşturabiliyorsunuz. Birkaç bölümden geçtikten sonra bu istek RouteServiceProvider ve ordan api.php ve web.php'ye gider. Aşağıda bir web.php için örnek kod bulunmaktadır.

                
use App\Http\Controllers\ProfileController; /* * /profile sayfası ziyaret edildiğinde ProfileController * class'ındaki edit methodunu çalıştırmaktadır. */ Route::get('profile', [ProfileController::class, 'edit']);

Middleware

Route ve controller içerisinde çeşitli kontroller yapmak için middleware class'ları kullanılır. Örneğin sadece giriş yapmış kullanıcıların ilgili routelara erişebilmesini isterseniz auth middleware'i kullanırsınız. kendi middleware class'larınızı yazarak istediğiniz kontrolleri yapabilir ve beklenen sonuca göre kullanıcıyı başka sayfaya yönlendirebilirsiniz.

                
/* * Yukarıdaki kodu biraz değiştirip middleware adı verdik, * böylece sadece giriş yapabilen kullanıcılar profil * düzenleme sayfasına gidebilecek */ Route::get('profile', [ProfileController::class, 'edit'])->middleware('auth');

Eloquent ORM

Eloquent ORM: SQL yazımını oldukça düşürmektedir ve daha nesnel bir yapıya dönüştürmektedir. Böylece sadece sorgu ve dizilerle değil objelerle (nesne) çalışarak OOP programlamanın avantajlarından daha çok yararlanmaktasınız.

Örneğin veri tabanından tüm kullanıcıları çekmek için $users = User::all(); şeklinde yazmanız gerekir.

Migration

Laravelde veri tabanında tablo oluşturma, kolon ekleme güncelleme gibi işlemler migration adı verilen class'lar ile gerçekleştiriliyor. Bu dosyaların adlarının sonunda oluşturulma tarihi yazar ve bir tabloda hangi migrationların daha önce çalıştırıldığı tutulur. Böylece yeni gelen migrationlar karışıklığa sebep olmaz ve çok hızlı güncellemeler yapılabilmektedir. Zero downtime deploymentlar açısından çok önemlidir.

                
Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name')->nullable(); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->string('username')->unique(); $table->rememberToken(); $table->timestamps(); });

Template Engine: Blade

Php ile web sayfaları oluştururken çok fazla php tagi açıp kapatıyoruz. <?php ?>  bunun yerine template engine yani blade dosyalarını kullanarak yazdığımız html içine çok rahat bir şekilde php gömebiliyoruz. Aşağıdaki kod for döngüsü içerisinde $posts dizisini iterate etmekte ve her defasında bir li tagi içerisinde o postun title'ını yazdırmaktadır.

                
@foreach($posts as $post) <li>{{ $post->title }}</li> @endforeach

Bunu template olmadan yazmak yazmak isteseydiniz...

                
<?php foreach($posts as $post){ ?> <li><?= $post->title ?><li> <?php } ?>

API Uygulamalar

Laravel ile hem dinamik html sayfalar üretebilirsiniz hem de api uygulaması oluşturabilirsiniz. API için farklı bir route dosyası bulunuyor. Oluşturduğunuz api adresleri (end pointleri) ornekdomain.com/api/... şeklinde ön ek alır. Bu ön ekin sebebi, ana domaninde uygulamanızı kullanmaya devam etmenizi sağlamak. Örneğin Ana domainde bir vue/react client oluşturup /api endpointi kullanarak api ile haberleşebilirsiniz.

Mix - Webpack

Laravel içerisinde npm ile beraber gelmektedir. Extra ihtiyacınız olan npm paketlerini aynı projeye ekleyebilirsiniz. Mix, webpack'in Laravel ile bütünleşmiş versiyonudur. Uygulamanızın assetlerini işlemek için (minifying, sass/scss transpile vs),  npm uygulamalar çalıştırmak için (vue/react) kullanabilirsiniz. /Resources klasöründeki çalışmalarınızı mix ile /public klasörüne build alırsınız.

Debug modu

Debug modu; localde çalışırken oluşan hataları çok ayrıntılı bir şekilde verirken productionda iken bu ayarı kapattığınızda karşınıza 500 hata sayfası çıkmaktadır. 

Bakım modu

Bakım modu aktif edildiğinde site erişimi dışarıya kapatılır. Sadece sizin erişmeniz için bir secret key tanımlayabilirsiniz. Eğer productionda hataya neden olan bir sorunu incelemek isterseniz bakım moduna alarak siteyi kullanıcılara kapatabilirsiniz. Düzenli güncellemelerde siteyi bakım moduna almak olası hataları engelleyecektir.

Faker ve Unit Test

Uygulamanızın daha az bug içermesi için test yazımı önemlidir. Faker kütüphanesi ile örnek veriler oluşturup kolayca unit test içinde kullanabilirsiniz. Bunu birde ci/cd içine dahil ederseniz tadından yenmez :)

Ekip çalışmasına yatkın

Laravelde her şeyin bir yeri, bir yolu var. Eğer Laravelin önerdiği yoldan giderseniz projenize sonradan dahil olan bir kişinin projeye alışması için hiçbir şey yapmasına gerek kalmıyor. Laravelin sistemini bilen bir geliştirici sizin projenizi incelediğinde sanki kendi yazmış gibi rahat bulacaktır aradığını.

Periyodik güncellemeler

Laravel haftalık minör güncellemeler sunuyor. Bu güncellemelerde ufak geliştirmeler, bug fixler, güvenlik açıkları için yamalar oluyor. Uzun vadede ise değişiklik gösterse de 6 ayda 1 büyük güncellemeler gelmektedir.

Güvenli

Periyodik güncellemeler ve uzun yılların tecrübesi ile Laravel şu an bulunduğu konumda sıkı güvenlik önlemleri içermektedir. Tabi bu uygulamanızı tamamen güvenilir yapar demek değildir fakat almanız gereken bir çok önlemi default olarak uygulamış olduğu için işiniz daha kolaylaşacaktır. Sonraki aşama sunucu ve yazdığınız kodda biraz daha dikkat kısmı oluyor.

Büyük topluluk ve kütüphane avantajı

Laravelin kendi çekirdeği dahil composer paketleri üzerinden çalışmaktadır. Var olan php paketlerinin haricinde specific olarak çok fazla Laravel paketi bulunmaktadır. Bu paketler Laravel'in mimarisini kullanarak (route, view, migration, controller vs) size hazır bir sistem sunuyor. Örneğin hazır auth paketleri ile bir login sistemini veri tabanından UI'a kadar hazır olarak size sunabiliyor. Aradığınız bir çok konuda hazır paket bulabilirsiniz. Özellikle Spatie firması bu konuda çok başarılı. Kullandıkları her kodu açık kaynağa çevirme gibi bir felsefeleri var :) Siz de eğer toplulukta bulunmayan bir işlemin kodunu yazmışsanız bunu açık kaynak paket olarak yayınlayabilirsiniz.