Rebuild Laravel E-Learning

1

Part 1: Pengenalan & Mengapa Saya Upgrade

2

Part 2: Setup Laravel 12 + Filament

3

Part 3: Desain Skema Database

4

Part 4: Autentikasi & Role User

5

Part 5: Membangun Sistem Ujian

6

Part 6: Fitur Real-Time

7

Part 7: Strategi Testing

8

Part 8: Deployment

Artikel ini tersedia dalam Bahasa Inggris

๐Ÿ‡ฌ๐Ÿ‡ง Read in English

10 Maret 2026

๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia

Membangun Ulang Aplikasi Laravel E-Learning: Perjalanan dari 5.2 ke Laravel Modern

Kisah upgrade platform e-learning legacy Laravel 5.2 ke Laravel modern dengan Filament, Livewire, dan best practices. Plus, preview series tutorial lengkap.

5 min read


Masalahnya: Codebase Berusia 7 Tahun

Pada tahun 2017, saya membangun sebuah platform e-learning untuk ujian online di sekolah menengah pertama. Dibuat dengan Laravel 5.2 dan PHP 5.6โ€”stack standar pada masa itu.

Maju cepat ke 2026, dan codebase tersebut masih digunakan. Memang berjalan, tapi:

  • ๐Ÿ”ด Kerentanan keamanan โ€” Laravel 5.2 sudah tidak mendapat patch keamanan sejak bertahun-tahun lalu
  • ๐Ÿ”ด PHP 5.6 sudah mati โ€” Kebanyakan penyedia hosting sudah tidak mendukungnya
  • ๐Ÿ”ด Fitur modern hilang โ€” Tidak ada update real-time, pengalaman mobile buruk
  • ๐Ÿ”ด Mimpi buruk maintenance โ€” Dependencies outdated, dokumentasi minim

Saatnya untuk rebuild total.

Apa yang Sistem Asli Lakukan

Sebelum masuk ke detail upgrade, saya jelaskan dulu apa yang dilakukan platform e-learning ini:

Untuk Siswa

  • ๐Ÿ“Š Dashboard โ€” Lihat kursus yang diikuti dan ujian mendatang
  • ๐Ÿ“ Ujian Online โ€” Ikuti ujian berjangka waktu dengan soal pilihan ganda
  • ๐Ÿ“ˆ Laporan Nilai โ€” Lihat hasil ujian dan progress keseluruhan
  • ๐Ÿ’ฌ Forum Diskusi โ€” Berinteraksi dengan guru dan teman sekelas

Untuk Guru

  • ๐Ÿ“š Manajemen Ujian โ€” Buat, edit, dan jadwalkan ujian online
  • โ“ Bank Soal โ€” Kelola soal dengan tingkat kesulitan berbeda
  • ๐Ÿ“Š Analitik โ€” Lihat performa siswa dan identifikasi area yang perlu ditingkatkan
  • ๐Ÿ“‹ Penilaian Tugas โ€” Review dan nilai submission siswa

Strategi Upgrade

Saya mempertimbangkan dua pendekatan:

PendekatanKelebihanKekurangan
Upgrade BertahapRisiko lebih rendah, kode existing tetap ada5.2 โ†’ 5.3 โ†’ 5.4 โ†’ ... โ†’ 11 (menyakitkan)
Rebuild TotalMulai dari awal, arsitektur modernEffort lebih besar di awal, butuh migrasi data

Saya memilih rebuild total. Alasannya:

  1. Loncatannya terlalu jauh โ€” Laravel 5.2 ke 11 melewati 9 major version
  2. Arsitektur sudah berevolusi โ€” Laravel modern menggunakan pattern berbeda
  3. Tools yang lebih baik sudah ada โ€” Filament, Livewire, dan Inertia belum ada di 2017
  4. Kesempatan belajar โ€” Membangun dari nol berarti memahami setiap baris kode

Tech Stack Baru

Berikut yang saya gunakan untuk versi rebuild:

KomponenLama (2017)Baru (2026)
FrameworkLaravel 5.2Laravel 12
PHP5.68.3
Admin PanelCustom BladeFilament 3
FrontendjQuery + BootstrapLivewire 3 + Tailwind
AuthenticationCustomLaravel Breeze
DatabaseMySQL 5.6MySQL 8 / PostgreSQL
TestingTidak ada ๐Ÿ˜…Pest PHP
DeploymentFTP (iya, beneran)GitHub Actions + VPS

Keputusan Arsitektur Utama

1. Filament untuk Admin Panel

Daripada membangun admin CRUD custom dari nol, saya menggunakan Filament 3. Filament menyediakan:

// Ini saja yang dibutuhkan untuk CRUD lengkap
class ExamResource extends Resource
{
    protected static ?string $model = Exam::class;
    
    public static function form(Form $form): Form
    {
        return $form->schema([
            TextInput::make('title')->required(),
            DateTimePicker::make('start_time'),
            DateTimePicker::make('end_time'),
            Select::make('subject_id')
                ->relationship('subject', 'name'),
        ]);
    }
}

Yang dulu butuh 500+ baris kode custom di 2017, sekarang hanya 50 baris dengan Filament.

2. Livewire untuk Ujian Real-Time

Sistem ujian lama menggunakan JavaScript polling untuk cek sisa waktu. Sekarang dengan Livewire:

class TakeExam extends Component
{
    public Exam $exam;
    public int $timeRemaining;
    
    public function mount(Exam $exam)
    {
        $this->exam = $exam;
        $this->timeRemaining = $exam->duration_minutes * 60;
    }
    
    #[Computed]
    public function isTimeUp(): bool
    {
        return $this->timeRemaining <= 0;
    }
}

Update real-time tanpa menulis kode WebSocket custom.

3. Testing Proper dari Hari Pertama

Codebase asli punya nol test. Versi baru menggunakan Pest PHP:

it('prevents students from taking expired exams', function () {
    $exam = Exam::factory()->expired()->create();
    $student = User::factory()->student()->create();
    
    actingAs($student)
        ->get(route('exams.take', $exam))
        ->assertForbidden();
});

Setiap fitur ditest sebelum dianggap "selesai."

Strategi Migrasi

Bagian paling tricky adalah migrasi data dari sistem lama. Berikut pendekatannya:

Step 1: Export Data Lama

-- Export dari database MySQL lama
SELECT * FROM siswa INTO OUTFILE '/tmp/students.csv';
SELECT * FROM guru INTO OUTFILE '/tmp/teachers.csv';
SELECT * FROM ujian INTO OUTFILE '/tmp/exams.csv';

Step 2: Transform ke Skema Baru

// Laravel Seeder untuk migrasi
class MigrateOldDataSeeder extends Seeder
{
    public function run(): void
    {
        $oldStudents = json_decode(
            file_get_contents(database_path('legacy/students.json'))
        );
        
        foreach ($oldStudents as $old) {
            User::create([
                'name' => $old->nama_siswa,
                'email' => $old->email ?? $old->nis . '@school.local',
                'role' => 'student',
                'legacy_id' => $old->id,
            ]);
        }
    }
}

Step 3: Validasi & Test

Jalankan kedua sistem secara paralel, bandingkan output, dan verifikasi integritas data.

Pelajaran yang Dipetik (Sejauh Ini)

1. Jangan Takut Rebuild

Kadang, refactor terbaik adalah rewrite. Codebase lama sudah menjalankan fungsinya, tapi berpegang padanya hanya akan menimbulkan lebih banyak masalah jangka panjang.

2. Laravel Modern Menyenangkan

Developer experience di Laravel 12 luar biasa. Artisan commands, Tinker, Laravel Herdโ€”semuanya just works.

3. Dokumentasi Sambil Membangun

Saya menulis artikel ini sambil membangun. Ini memaksa saya menjelaskan keputusan saya, yang sering mengungkap cacat dalam pemikiran saya.

Series Tutorial Lengkap

Artikel ini adalah Part 1 dari series lengkap yang mendokumentasikan seluruh rebuild:

PartTopikLink
1Pengenalan & Mengapa Saya Upgradeโœ… Artikel ini
2Setup Laravel 12 + FilamentBaca โ†’
3Desain Skema DatabaseBaca โ†’
4Autentikasi & Role UserBaca โ†’
5Membangun Sistem UjianBaca โ†’
6Fitur Real-Time dengan LivewireBaca โ†’
7Strategi TestingBaca โ†’
8Deployment ke ProductionBaca โ†’

Repository

Codebase legacy asli tersedia di GitHub:

๐Ÿ”— mfarim/laravel-elearning โ€” 42 โญ | 15 Forks

Versi baru akan dirilis sebagai repository terpisah setelah siap untuk production.

Kesimpulan

Upgrade aplikasi Laravel berusia 7 tahun bukan hanya soal mengganti nomor versiโ€”ini tentang memikirkan ulang arsitektur, mengadopsi tools modern, dan membangun sesuatu yang akan bertahan 7 tahun ke depan.

Kalau kamu menghadapi tantangan upgrade legacy yang serupa, saya harap series ini bisa membantu. Jangan ragu untuk menghubungi saya dengan pertanyaan atau berbagi pengalaman upgrade kamu sendiri!


Punya aplikasi Laravel legacy yang perlu diupgrade? Saya menawarkan layanan konsultasi untuk modernisasi Laravel. Hubungi saya.

Lanjut Membaca

Artikel Selanjutnya โ†’

Laravel E-Learning Part 2: Setting Up Laravel 12 with Filament Admin Panel

Next article thumbnail