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:
| Pendekatan | Kelebihan | Kekurangan |
|---|---|---|
| Upgrade Bertahap | Risiko lebih rendah, kode existing tetap ada | 5.2 โ 5.3 โ 5.4 โ ... โ 11 (menyakitkan) |
| Rebuild Total | Mulai dari awal, arsitektur modern | Effort lebih besar di awal, butuh migrasi data |
Saya memilih rebuild total. Alasannya:
- Loncatannya terlalu jauh โ Laravel 5.2 ke 11 melewati 9 major version
- Arsitektur sudah berevolusi โ Laravel modern menggunakan pattern berbeda
- Tools yang lebih baik sudah ada โ Filament, Livewire, dan Inertia belum ada di 2017
- Kesempatan belajar โ Membangun dari nol berarti memahami setiap baris kode
Tech Stack Baru
Berikut yang saya gunakan untuk versi rebuild:
| Komponen | Lama (2017) | Baru (2026) |
|---|---|---|
| Framework | Laravel 5.2 | Laravel 12 |
| PHP | 5.6 | 8.3 |
| Admin Panel | Custom Blade | Filament 3 |
| Frontend | jQuery + Bootstrap | Livewire 3 + Tailwind |
| Authentication | Custom | Laravel Breeze |
| Database | MySQL 5.6 | MySQL 8 / PostgreSQL |
| Testing | Tidak ada ๐ | Pest PHP |
| Deployment | FTP (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:
| Part | Topik | Link |
|---|---|---|
| 1 | Pengenalan & Mengapa Saya Upgrade | โ Artikel ini |
| 2 | Setup Laravel 12 + Filament | Baca โ |
| 3 | Desain Skema Database | Baca โ |
| 4 | Autentikasi & Role User | Baca โ |
| 5 | Membangun Sistem Ujian | Baca โ |
| 6 | Fitur Real-Time dengan Livewire | Baca โ |
| 7 | Strategi Testing | Baca โ |
| 8 | Deployment ke Production | Baca โ |
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.
