Laravel 4 ile ilk projeme başlarken
Ham PHP'den bir framework'e geçişin getirdiği düzen: Laravel 4 ile ilk izlenimler, kurulum ve temel yapı.
Altı yıldır PHP yazıyorum. Bu sürede çoğu proje ham PHP ile ya da kendi yazdığım küçük yapılarla büyüdü. Her projede yönlendirme (routing), veritabanı bağlantısı, oturum yönetimi gibi şeyleri tekrar tekrar kurmak, zamanla rutin bir yük haline geldi. Bir noktada “bunu başkaları nasıl çözüyor” diye bakmaya başladım.
Laravel ile geçen yıldan beri iç içedim ama ciddiye almamıştım. Bu ay bir müşteri projesi için gerçekten kullanmaya karar verdim. Birkaç haftalık gözlemimi paylaşmak istiyorum.
Framework neden şimdi?
Ham PHP’de bir proje yaparken her şeyi kendiniz kuruyorsunuz. Bu başlangıçta kontrol hissi veriyor ama büyüdükçe bakımı güçleşiyor. Composer ve PSR-4 ile yapı biraz düzeldi ama yönlendirme, form işleme, kimlik doğrulama gibi tekrar eden ihtiyaçları her seferinde sıfırdan kurmak verimsiz.
Laravel 4, Taylor Otwell tarafından geliştirilen, Composer üzerine kurulu bir PHP framework’üdür. Symfony bileşenlerini kullanıyor; bu yüzden sıfırdan yazılmış “başka bir framework” değil, olgun kütüphaneler üstüne kurulu bir yapı.
Kurulum
Composer gerektiriyor, bu yüzden önceki haftalardaki alışkanlıklar burada işe yarıyor:
composer create-project laravel/laravel projem 4.2.*
Bu komut Laravel 4.2’nin son sürümünü indiriyor, bağımlılıkları kuruyor ve projem/ klasöründe hazır bir iskelet oluşturuyor. Birkaç dakika içinde çalışan bir uygulama var.
Dizin yapısı
İlk baktığımda biraz yabancı geldi ama birkaç günde alıştım:
app/
├── config/ → veritabanı, uygulama, posta yapılandırmaları
├── controllers/ → denetleyici sınıfları
├── models/ → model sınıfları
├── views/ → Blade şablon dosyaları
├── routes.php → tüm URL tanımları
public/ → web sunucusunun kök dizini
vendor/ → Composer paketleri
Ham PHP projelerinde public_html/ altına her şeyi koyuyordum. Burada yalnızca public/ açık, geri kalan her şey dışarıda. Güvenlik açısından mantıklı bir yaklaşım.
Rotalar (Routes)
Laravel’de URL’leri app/routes.php dosyasında tanımlıyorsunuz:
<?php
Route::get('/', function() {
return View::make('anasayfa');
});
Route::get('/kullaniciler', 'KullaniciController@index');
Route::post('/kullaniciler', 'KullaniciController@store');
İlk örnekte bir URL’ye doğrudan bir closure atanıyor. İkinci ve üçüncüde bir denetleyicinin metodu belirtiliyor. Bu yaklaşım switch/if zinciriyle yönlendirme yazan eski yönteme kıyasla çok daha okunaklı.
Denetleyici (Controller)
<?php
class KullaniciController extends BaseController
{
public function index()
{
$kullanicilar = User::all();
return View::make('kullaniciler.liste', compact('kullanicilar'));
}
public function store()
{
$veri = Input::all();
// doğrulama ve kaydetme...
return Redirect::to('/kullaniciler');
}
}
BaseController Laravel’in temel denetleyicisi. View::make görünüm dosyasını döndürür, Input::all() POST/GET verilerini alır, Redirect::to yönlendirir. Bunların hepsi Laravel’in facade katmanı üzerinden erişilen statik benzeri arayüzler.
İlk izlenimler
Birkaç şey dikkatimi çekti:
Facade yaklaşımı: DB::, Route::, Input:: gibi statik çağrılar başlangıçta garip geldi. Bunlar gerçek statik sınıflar değil; arka planda service container’dan çözülüyor. Nasıl çalıştığını tam kavramak birkaç gün aldı.
Konfigürasyon: app/config/database.php dosyasında veritabanı bilgilerini düzenliyorsunuz. Ortam bazlı yapılandırma var; geliştirme ve canlı ortam için farklı değerler tutabiliyorsunuz. Bunu ham PHP’de her seferinde kendim kurardım.
Artisan: Framework ile gelen komut satırı aracı (CLI). Denetleyici, model gibi dosyaları komutla oluşturabiliyorsunuz:
php artisan controller:make KullaniciController
Bu küçük kolaylıklar zaman içinde birikiyor.
Ham PHP’den farkı
Framework kullanmanın maliyeti de var: öğrenme eğrisi, framework’ün kurallarına uymak zorunda kalmak, arka planda ne olduğunu bilmeden ilerlemek. İlk proje için bu eğri gerçek. Ama tekrar eden kurulum işlerinden kurtulmak ve tutarlı bir yapı elde etmek buna değiyor.
Şu an Laravel 4 ile gerçek bir proje inşa ediyorum. Uygulamanın her katmanını tanıdıkça bu yazı serisini devam ettireceğim.