Gereksinimler ve Ön Hazırlık
Bu projeye başlamadan önce bilgisayarınızda PHP 8.2 veya üzeri bir sürümün, Composer paket yöneticisinin ve Laravel'in çalışabileceği bir veritabanı sisteminin (MySQL veya PostgreSQL) kurulu olması gerekir. Ayrıca, ön yüzde takvimi görselleştirmek için popüler bir kütüphane olan FullCalendar.js kullanacağız.
- Laravel 11+ Framework
- PHP 8.2+
- Node.js ve NPM (Frontend varlıkları için)
- Veritabanı: MySQL 8.0+
Veritabanı Tasarımı ve Migration İşlemleri
Takvim sisteminin kalbi, etkinliklerin saklandığı veritabanı tablosudur. Kullanıcıların etkinliklerini tutmak için events adında bir tablo oluşturacağız. Bu tablo, etkinliğin başlangıç ve bitiş zamanlarını, başlığını ve kullanıcı ile olan ilişkisini içermelidir.
// Migration dosyasını oluşturma komutu:
// php artisan make:migration create_events_table
public function up(): void
{
Schema::create('events', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->string('title');
$table->text('description')->nullable();
$table->dateTime('start_time');
$table->dateTime('end_time');
$table->timestamps();
});
}
Yukarıdaki kod bloğu, user_id ile kullanıcılar arasında bire-çok bir ilişki kurar. onDelete('cascade') kuralı, kullanıcı silindiğinde ona ait etkinliklerin de otomatik olarak temizlenmesini sağlar; bu, veritabanı bütünlüğü için kritiktir.
Etkinlik Modeli ve İlişkilerin Tanımlanması
Laravel'in Eloquent ORM yapısını kullanarak, Event modeli üzerinden veritabanı işlemlerini gerçekleştireceğiz. Model içerisinde, etkinliklerin kullanıcı ile olan ilişkisini tanımlamak, veriye erişimi oldukça kolaylaştırır.
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Event extends Model
{
protected $fillable = ['title', 'description', 'start_time', 'end_time', 'user_id'];
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
Modelde tanımlanan $fillable dizisi, toplu atama (mass assignment) açıklarını engellemek için sadece izin verilen alanların doldurulmasını sağlar. Bu, Laravel projelerinde güvenlik için standart bir uygulamadır.
API ve Controller Katmanı
Takvim verilerini ön yüze (frontend) JSON formatında aktarmak için bir Controller oluşturmalıyız. Bu Controller, sadece o an giriş yapmış kullanıcının etkinliklerini getirecek şekilde filtrelenmelidir.
namespace App\Http\Controllers;
use App\Models\Event;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class EventController extends Controller
{
public function index()
{
return Event::where('user_id', Auth::id())->get(['id', 'title', 'start_time as start', 'end_time as end']);
}
}
Burada start_time ve end_time alanlarını, FullCalendar kütüphanesinin beklediği start ve end isimlerine alias (takma ad) kullanarak dönüştürdük. Bu, ön yüzde ekstra bir veri düzenleme işlemi yapmamızı engeller.
Frontend Entegrasyonu: FullCalendar Kullanımı
Takvimi tarayıcıda göstermek için bir Blade dosyası oluşturup FullCalendar kütüphanesini dahil etmeliyiz. Aşağıdaki örnek, verilerin API'den nasıl çekileceğini gösterir.
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
events: '/api/events' // Controller'dan gelen JSON verisi
});
calendar.render();
});
Bu yapı, sayfa yüklendiğinde otomatik olarak /api/events rotasına bir GET isteği gönderir ve dönen JSON verisini takvim üzerinde etkinlik olarak işler.
Veri Doğrulama ve Güvenlik Uyarıları
Etkinlik oluştururken kullanıcıdan gelen verilerin doğrulanması (validation) hayati önem taşır. SQL Injection saldırılarını önlemek için her zaman Laravel'in FormRequest sınıfını kullanmalısınız.
Güvenlik Uyarısı: Kullanıcıdan gelen tarih verilerini mutlaka
date_formatkuralı ile doğrulayın. Ayrıca, her zamanAuth::id()kullanarak verinin doğru kullanıcıya ait olduğunu doğrulayın, asla istemciden gelenuser_iddeğerine güvenmeyin.
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'start_time' => 'required|date|after:now',
'end_time' => 'required|date|after:start_time',
]);
$request->user()->events()->create($validated);
}
Karşılaştırma Tablosu: Takvim Yönetim Yöntemleri
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| FullCalendar (JS) | Görsel zenginlik, sürükle-bırak desteği | Daha fazla frontend bilgisi gerektirir |
| Blade + HTML Tablo | Basit, hızlı kurulum | Dinamik etkileşim kısıtlı |
| Livewire Takvim | Laravel ile tam uyum, JS yazmadan çözüm | Özelleştirme bazen karmaşık olabilir |
Sıkça Sorulan Sorular
Takvimde etkinlikleri sürükleyip bırakabilir miyim?
Evet, FullCalendar kütüphanesinin editable: true özelliğini aktif ederek ve Laravel tarafında bir PUT/PATCH isteğiyle veritabanını güncelleyerek bu özelliği kolayca ekleyebilirsiniz.
Çok kullanıcılı sistemlerde etkinlikler karışır mı?
Hayır, veritabanı sorgularınızda her zaman where('user_id', Auth::id()) filtresini kullandığınız sürece kullanıcılar sadece kendi etkinliklerini görür.
Tarih formatı sorunlarını nasıl çözerim?
Laravel'in Carbon kütüphanesini kullanarak tarihleri her zaman UTC formatında saklayın ve kullanıcıya gösterirken yerel saat dilimine dönüştürün.
Mobil cihazlarda takvim nasıl görünür?
FullCalendar duyarlı (responsive) bir yapıdadır; ancak küçük ekranlarda "list" görünümüne geçiş yapmasını sağlayarak kullanıcı deneyimini iyileştirebilirsiniz.
Etkinliklere hatırlatıcı ekleyebilir miyim?
Evet, Laravel'in Task Scheduling (görev zamanlayıcı) ve Notifications sistemini kullanarak etkinlik saatinden önce kullanıcıya e-posta veya veritabanı bildirimi gönderebilirsiniz.
Performans Optimizasyonu ve Büyük Veri Setleri
Takvim sisteminizde binlerce etkinlik birikmeye başladığında, standart veritabanı sorguları yavaşlamaya başlayabilir. Özellikle events tablosundaki kayıt sayısı arttığında, takvimin ilk yüklenme süresi kullanıcı deneyimini olumsuz etkiler. Bu durumu yönetmek için "Lazy Loading" ve veritabanı indeksleme stratejilerini uygulamalısınız.
Veritabanı İndeksleme
Takvim sorguları genellikle tarih aralıklarına göre (start_date ve end_date) yapılır. Bu sütunlara indeks eklemek, sorgu süresini milisaniyeler seviyesine çeker.
// Migration dosyanızda indeks tanımlama
Schema::table('events', function (Blueprint $table) {
$table->index('start_date');
$table->index('end_date');
$table->index('user_id'); // Kullanıcı bazlı filtreleme için
});
API Yanıtlarını Önbelleğe Alma (Caching)
Kullanıcıların etkinlikleri sık değişmiyorsa, API yanıtlarını Laravel'in Cache mekanizması ile önbelleğe alarak veritabanı yükünü azaltabilirsiniz. Aşağıdaki örnek, kullanıcıya özel etkinlik listesini 10 dakika boyunca önbellekte tutar:
public function getEvents(Request $request)
{
$cacheKey = 'user_' . auth()->id() . '_events';
return Cache::remember($cacheKey, 600, function () {
return Event::where('user_id', auth()->id())->get();
});
}
İleri Düzey Hata Ayıklama ve Loglama
Takvim sistemlerinde en sık karşılaşılan hatalar genellikle tarih formatı uyuşmazlıkları ve yetkilendirme sorunlarıdır. Hataları hızlıca tespit etmek için Laravel'in Log facade yapısını kullanmak kritik öneme sahiptir.
Özel İstisna Yönetimi
Etkinlik oluşturma sırasında oluşabilecek hataları yakalamak için try-catch bloklarını Controller katmanında mutlaka kullanın:
public function store(Request $request)
{
try {
$validated = $request->validate([...]);
return Event::create($validated);
} catch (\Exception $e) {
Log::error('Etkinlik oluşturma hatası: ' . $e->getMessage());
return response()->json(['error' => 'İşlem başarısız.'], 500);
}
}
Frontend Hata İzleme
FullCalendar tarafında yaşanan hataları yakalamak için eventRenderError veya loading callback fonksiyonlarını kullanarak kullanıcıya anlamlı hata mesajları gösterebilirsiniz:
calendar.setOption('loading', function(isLoading) {
if (isLoading) {
// Yükleniyor göstergesi
} else {
// Yükleme bitti
}
});
Deployment ve Sunucu Yapılandırması
Uygulamanızı canlıya alırken (production), takvim sisteminin zaman dilimi (timezone) ayarlarının sunucu ile senkronize olduğundan emin olun. config/app.php dosyasındaki timezone ayarını, hedef kitlenizin bulunduğu bölgeye göre yapılandırın.
- Zaman Dilimi: Sunucu saatini
UTCtutun, kullanıcıya gösterirken yerel saate çevirin. - Queue (Kuyruk) Yapısı: Hatırlatıcı e-postaları için
RedisveyaDatabasesürücüsünü kullanarak bir kuyruk sistemi kurun. - SSL Sertifikası: Takvim verileri kişisel bilgiler içerebileceği için mutlaka HTTPS protokolünü zorunlu kılın.
Sonuç
Laravel ile dinamik bir kullanıcı etkinlik takvim sistemi oluşturmak, doğru veritabanı ilişkileri ve güvenli bir API yapısı ile oldukça verimli bir süreçtir. Bu rehberde öğrendiğiniz temel adımları uygulayarak, projenize sürükle-bırak özelliği, hatırlatıcılar ve farklı takvim görünümleri ekleyerek sistemi daha ileri seviyeye taşıyabilirsiniz. Bir sonraki adım olarak, Laravel Livewire kullanarak sayfa yenilenmeden etkinlik ekleme formları tasarlamayı deneyebilirsiniz.
Yasal Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka kapsamlı güvenlik testleri yapın, CSRF korumasını aktif tutun ve kullanıcı girişlerini (input sanitization) titizlikle kontrol edin.


Yorumlar (0)
Yorum Yaz