Laravel İle Restful Apı Geliştirme Nasıl Yapılır?

Laravel İle Restful Apı Geliştirme Nasıl Yapılır?
Laravel İle Restful Apı Geliştirme Nasıl Yapılır?

Gereksinimler ve Ortam Kurulumu

Laravel ile çalışmaya başlamadan önce sisteminizde PHP 8.3 veya üzeri bir sürümün, Composer paket yöneticisinin ve bir veritabanı yönetim sisteminin (MySQL veya PostgreSQL) kurulu olması gerekir. API testlerini gerçekleştirmek için Postman veya Insomnia gibi bir araç edinmeniz süreci kolaylaştıracaktır.

Yeni bir Laravel projesi oluşturmak için terminalinizde şu komutu çalıştırın:

composer create-project laravel/laravel api-projesi
cd api-projesi
php artisan serve

Bu komutlar, Laravel'in en güncel sürümünü bilgisayarınıza indirir ve yerel bir geliştirme sunucusu başlatır. Projenin başarıyla çalıştığını doğrulamak için tarayıcınızda http://127.0.0.1:8000 adresini ziyaret edebilirsiniz.

Veritabanı Modeli ve Migration Oluşturma

RESTful API'lerin temelinde veritabanı tabloları ile eşleşen modeller yer alır. Bir "Ürün" (Product) yönetimi API'si yapacağımızı varsayalım. Laravel'in artisan komut satırı aracı, hem model hem de veritabanı şemasını oluşturmak için bize büyük kolaylık sağlar.

Aşağıdaki komut, Product modelini ve onunla ilişkili migration (veritabanı göçü) dosyasını oluşturur:

php artisan make:model Product -m

Oluşturulan migration dosyasını database/migrations dizininde bulabilirsiniz. Tablo sütunlarını tanımlamak için up metodunu güncelleyin:

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->decimal('price', 8, 2);
        $table->text('description')->nullable();
        $table->timestamps();
    });
}

Bu işlemden sonra php artisan migrate komutunu çalıştırarak veritabanı tablonuzu oluşturun. Bu adım, verilerinizin tutarlı bir yapıda saklanmasını sağlar.

RESTful Controller Yapısı ve Veri İşleme

Controller'lar, gelen HTTP isteklerini karşılayan ve iş mantığını yöneten sınıflardır. API'ler için özel olarak tasarlanmış "API Resource Controller" yapısını kullanmak, standart metodları otomatik olarak oluşturur.

Controller dosyasını oluşturmak için şu komutu kullanın:

php artisan make:controller Api/ProductController --api

Bu komut, app/Http/Controllers/Api dizininde ProductController oluşturur. İçerisine verileri listeleme (index) ve kaydetme (store) mantığını ekleyelim:

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    public function index()
    {
        return Product::all();
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'price' => 'required|numeric',
        ]);

        return Product::create($validated);
    }
}

Burada validate metodu, gelen verinin güvenliğini sağlar ve hatalı girdileri otomatik olarak reddeder. Bu, SQL Injection ve geçersiz veri girişine karşı ilk savunma hattınızdır.

API Rotalarını Yapılandırma

Laravel'de API rotaları, routes/api.php dosyası içerisinde tanımlanır. Bu dosya, web rotalarından farklı olarak otomatik olarak /api ön eki ile çalışır ve CSRF koruması gibi web'e özgü middleware'lerden arındırılmıştır.

Rotalarınızı tanımlamak için şu kodu routes/api.php dosyasına ekleyin:

use App\Http\Controllers\Api\ProductController;
use Illuminate\Support\Facades\Route;

Route::apiResource('products', ProductController::class);

apiResource kullanımı, Laravel'in standart RESTful metodlarını (GET, POST, PUT, DELETE) tek satırda tanımlamasını sağlar. Artık /api/products adresine yapılacak istekler, ProductController içerisindeki ilgili metodlara yönlendirilecektir.

API Yanıtlarını Standartlaştırma (API Resources)

API'nizden dönen veriyi doğrudan veritabanı modeli olarak döndürmek yerine, JsonResource sınıflarını kullanmak daha profesyoneldir. Bu sayede verinin yapısını kontrol edebilir ve istemciye sadece ihtiyaç duyulan alanları gönderebilirsiniz.

Resource oluşturmak için:

php artisan make:resource ProductResource

Oluşturulan app/Http/Resources/ProductResource.php dosyasını şu şekilde düzenleyin:

public function toArray($request)
{
    return [
        'id' => $this->id,
        'urun_adi' => $this->name,
        'fiyat' => number_format($this->price, 2) . ' TL',
    ];
}

Artık Controller içerisinde bu sınıfı kullanarak veriyi dönüştürebilirsiniz: return ProductResource::collection(Product::all());

API Geliştirmede Karşılaştırma Tablosu

Yöntem Avantajı Dezavantajı
Direct Model Return Hızlı ve basit uygulama Veri yapısı üzerinde kontrol azdır
API Resources Veri formatı üzerinde tam kontrol Ekstra sınıf yönetimi gerektirir
Third-party Packages Gelişmiş özellikler (Swagger vb.) Bağımlılık oluşturur
Kritik Güvenlik Uyarısı: API'nizi üretim ortamına almadan önce mutlaka kimlik doğrulama (Laravel Sanctum kullanılması önerilir) ve hız sınırlayıcı (Rate Limiting) mekanizmalarını aktif edin. Kullanıcıdan gelen verileri asla doğrudan veritabanına kaydetmeyin; her zaman FormRequest veya validate() ile doğrulayın.

Sıkça Sorulan Sorular

API'lerde CSRF koruması gerekli midir?

Hayır, Laravel'in api.php rotaları varsayılan olarak CSRF koruması gerektirmez, çünkü API'ler genellikle token (token tabanlı kimlik doğrulama) ile çalışır.

Neden API Resource kullanmalıyım?

Veritabanı şemanız değişse bile API'nizin dışarıya sunduğu veri formatını sabit tutmanızı sağlar; bu da API'nizi kullanan uygulamaların bozulmasını engeller.

Hata mesajlarını nasıl özelleştiririm?

app/Exceptions/Handler.php dosyasındaki render metodunu kullanarak API'niz için özel JSON hata yanıtları dönebilirsiniz.

Laravel Sanctum nedir?

Sanctum, SPA (Single Page Application) ve basit API'ler için hafif bir kimlik doğrulama sistemidir; API anahtarları yönetimi için idealdir.

API versiyonlaması nasıl yapılır?

Rotalarınızı Route::prefix('v1')->group(...) şeklinde gruplayarak API'nizin farklı sürümlerini aynı anda yayında tutabilirsiniz.

API Performansını Artırma: Eager Loading ve Caching

RESTful API'lerde en sık karşılaşılan sorunlardan biri "N+1" sorgu problemidir. Laravel'in sunduğu Eager Loading özelliği, ilişkili verileri tek bir sorguda çekerek veritabanı yükünü ciddi oranda azaltır. Ayrıca, sık erişilen veriler için Redis veya Memcached kullanarak yanıt sürelerini milisaniyelere indirebilirsiniz.

Eager Loading Kullanımı

İlişkili modelleri with() metodu ile yükleyerek veritabanı trafiğini optimize edin:

// Controller içerisinde N+1 sorununu engelleme
public function index()
{
    // 'comments' ilişkisini tek sorguda çeker
    $posts = Post::with('comments')->paginate(15);
    return PostResource::collection($posts);
}

Cache Stratejileri

API yanıtlarını önbelleğe almak, özellikle yoğun trafik alan uç noktalar için kritiktir. Laravel'in Cache facade'ini kullanarak verileri belirli bir süre saklayabilirsiniz:

public function getStats()
{
    return Cache::remember('api_stats', 3600, function () {
        return User::selectRaw('count(*) as total')->get();
    });
}

API Test Süreçleri: Feature Testleri

API'nizin kararlılığını korumak için yazılan testler, projenin uzun vadeli başarısı için zorunludur. Laravel, PHPUnit veya Pest kullanarak API uç noktalarınızı simüle etmenize olanak tanır.

Örnek Bir API Test Senaryosu

Bir ürün oluşturma (POST) isteğinin doğruluğunu test etmek için aşağıdaki yapıyı kullanabilirsiniz:

public function test_product_can_be_created()
{
    $response = $this->postJson('/api/v1/products', [
        'name' => 'Test Ürünü',
        'price' => 99.99
    ]);

    $response->assertStatus(201)
             ->assertJson([
                 'created' => true,
             ]);
}

Testlerde Dikkat Edilmesi Gerekenler

  • Veritabanı İzolasyonu: Testlerinizi çalıştırırken RefreshDatabase trait'ini kullanarak her testin temiz bir veritabanı üzerinde koşmasını sağlayın.
  • Mocking: Dış servislerle (ödeme sistemleri, SMS servisleri) etkileşime giren API'lerde, gerçek servisleri çağırmak yerine Mockery veya Laravel'in Http::fake() metodunu kullanın.
  • Hata Durumları: Sadece başarılı senaryoları değil; 404, 403 ve 422 (validation error) gibi hata durumlarını da test edin.

API Deployment ve Güvenlik İpuçları

API'nizi yayına alırken (deployment) performans ve güvenlik ayarlarını optimize etmek, uygulamanın dış saldırılara karşı direncini artırır.

Güvenlik Kontrol Listesi

Kontrol Açıklama
Rate Limiting RouteServiceProvider üzerinden API hız sınırlarını belirleyin.
HTTPS Zorunluluğu Tüm API trafiğini SSL/TLS üzerinden şifreleyin.
Debug Modu Canlı ortamda APP_DEBUG=false olduğundan emin olun.

Hız sınırlarını yapılandırmak için app/Providers/RouteServiceProvider.php dosyasında şu düzenlemeyi yapabilirsiniz:

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});

Sonuç

Laravel ile RESTful API geliştirmek, doğru araçlar ve standartlar kullanıldığında oldukça verimli bir süreçtir. Bu rehberde veritabanı modellemesinden, rota yönetimine ve veri formatlamaya kadar temel adımları tamamladınız. Bir sonraki adım olarak, Laravel Sanctum ile kullanıcı kimlik doğrulaması ekleyerek API'nizi güvenli hale getirmeyi ve Swagger/OpenAPI entegrasyonu ile API dokümantasyonu oluşturmayı öğrenmenizi öneririm. Yazılım geliştirme süreçlerinde tutarlılık ve güvenlik, başarının anahtarıdır.

Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Teknoloji ve yazılım kullanımı üzerine pratik kılavuzlar hazırlıyorum. Karmaşık dijital araçları, herkesin hızlıca öğrenebileceği sade rehberler haline getirmekte uzmanım.

Yorumlar (0)

Yorum Yaz