Skip to content

Upgrade ke laravel 13#1050

Merged
affandii06 merged 29 commits into
rilis-devfrom
upgrade/laravel-13
Jun 14, 2026
Merged

Upgrade ke laravel 13#1050
affandii06 merged 29 commits into
rilis-devfrom
upgrade/laravel-13

Conversation

@pandigresik

@pandigresik pandigresik commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Pull Request: Upgrade Laravel 10.48 → 13.13 (PHP 8.3)

Deskripsi

Upgrade framework Laravel dari versi 10.48.29 ke 13.13.0, beserta seluruh dependency pendukung ke versi yang kompatibel. Upgrade ini dilakukan bertahap (L10→L11→L12→L13) untuk memastikan aplikasi tetap up-to-date dengan framework terbaru, mengurangi gap versi, dan memudahkan penerapan patch keamanan serta upgrade di masa depan. PHP requirement dinaikkan dari ^8.1 ke ^8.3 sesuai syarat sistem Laravel 13.

Perubahan yang dilakukan:

  1. Framework & PHP Upgrade: laravel/framework ^10.48 → ^13.0, PHP ^8.1 → ^8.4. Seluruh dependency mayor di-update ke versi kompatibel (Sanctum 4, Tinker 3, PHPUnit 11, Collision 8, dll).
  2. Spatie CSP v2 → v3: Migrasi total — CustomCSPPolicy (extend Basic) diganti CustomCspPreset (implement Preset). Method addDirective()add(). Route exclusion dipindah ke middleware CspExclusion terpisah. Config file csp.php direstruktur.
  3. Intervention Image v2 → v3: API berubah — Image::make()Image::read(), ->resize()->scale(), ->save() pakai named argument quality:. Service provider & facade import diperbarui. Config config/image.php diterbitkan.
  4. Carbon 3 Strict Types: env() mengembalikan string, tapi Carbon 3 mewajibkan int|float. Semua numeric config values di config/app.php dan config/rate-limiter.php diberi (int) cast.
  5. CSP Nonce Helper: csp_nonce() helper didefinisikan secara manual di app/Helpers/general.php (helper ini dihapus di CSP v3).
  6. Perbaikan Runtime Errors: Null guard pada VisitorObserver untuk Location::get(), guard @if(isset($article->id)) di blade artikel, dan fallback url() untuk route dinamis.
  7. Blade View Updates: Template JS Validation diupdate — hapus atribut nonce=csp_nonce(), ganti DOMContentLoadedjQuery.ready().
  8. PHP 8.4 Deprecation Fixes: BaseRepository.php — perbaiki nullable syntax ?int untuk kompatibilitas PHP 8.4.
  9. GitHub Actions CI: PHP version di semua workflow dari 8.1 ke 8.4.
  10. Tests: CSP Policy tests diadaptasi ke v3. Seluruh 405 test passing (0 failures).

Alasan perubahan:

  • Kompatibilitas framework: Laravel 10 sudah memasuki akhir masa support (security fixes only, Maret 2025). Laravel 13 adalah rilis stabil terbaru dengan dukungan penuh.
  • Keamanan: Upgrade berantai memungkinkan aplikasi mendapatkan patch keamanan terbaru dari framework dan seluruh dependency.
  • PHP 8.3+: Memanfaatkan fitur dan performa PHP 8.3+, serta menghindari masalah kompatibilitas dengan dependency yang sudah meninggalkan PHP 8.1.
  • Strict type enforcement: Carbon 3 memperketat tipe argumen; string dari env() harus di-cast ke int agar tidak error runtime.
  • BC break dependency: Spatie CSP v3 dan Intervention Image v3 memiliki API yang sama sekali berbeda dari v2 — diperlukan migrasi total.

Dampak perubahan:

Framework up-to-date: Laravel 13.13 dengan dukungan penuh dan patch keamanan terbaru
Dependency modern: Semua package mayor di-update ke versi kompatibel Laravel 13
Security: CSP nonce bekerja dengan benar, inline styles/scripts tidak diblokir
Stability: Carbon 3 strict types terpenuhi — tidak ada error runtime
Zero test regression: 405 test passing (0 failures, 0 errors)
CI/CD: GitHub Actions menggunakan PHP 8.3 sesuai requirement baru

Masalah Terkait (Related Issue)

  • Upgrade untuk issue #1049

Langkah untuk mereproduksi (Steps to Reproduce)

Sebelum upgrade (masalah):

  1. Jalankan composer install dengan PHP 8.1 dan Laravel 10
  2. Buka halaman yang menggunakan CSP → CSS lokal dan inline script diblokir
  3. Jalankan fitur upload logo/favicon → error karena API Intervention Image v2 tidak kompatibel
  4. Buka halaman dengan OTP rate limiter → error Carbon::rawAddUnit(): Argument #3 must be of type int|float, string given
  5. Buka halaman artikel → error Missing required parameter for Route: web.artikel.show
  6. ❌ Aplikasi tidak berfungsi penuh, banyak error runtime

Setelah upgrade (fix):

  1. Jalankan composer install dengan PHP 8.4 dan Laravel 13
  2. Buka halaman dengan CSP → CSS lokal & inline script berjalan dengan nonce
  3. Upload logo/favicon → berhasil dengan Intervention Image v3 API
  4. Buka halaman dengan OTP rate limiter → tidak ada error, rate limiting berjalan normal
  5. Buka halaman artikel → tidak ada error missing parameter
  6. ✅ Aplikasi berfungsi penuh, semua test passing

Testing pada fitur lain yang terkait:

  • PHPUnit test suite ✅ 405 passing, 0 failures
  • CSP policy ✅ tests passing
  • Unit tests ✅ 19/19 passing

Daftar Periksa (Checklist)

  • Saya telah mematuhi aturan penulisan script.
  • Saya telah mengikuti proses review pull request.
  • PHPUnit test suite telah dijalankan dan berhasil (405 tests, 0 failures)
  • Testing manual telah dilakukan di environment development
  • Tidak ada console error atau warning (selain PHPUnit deprecations dari kode test)
  • Code sudah di-review oleh [minimal 1 orang]

Teknis Detail

Penjelasan Teknis

Migration Spatie CSP v2 → v3

CSP v3 mengubah arsitektur secara fundamental:

  • Policy → Preset: Sebelumnya class policy extends Spatie\Csp\Policies\Basic. Sekarang class preset harus mengimplement Spatie\Csp\Preset dan menerima Policy object di method configure().
  • API rename: addDirective(Directive::STYLE, [...])add(Directive::STYLE, [...])
  • Nonce: $policy->addNonce(Directive::SCRIPT) untuk menambahkan nonce secara otomatis.
  • Exclusion: Method shouldBeApplied() dihapus. Route exclusion ditangani middleware CspExclusion yang menonaktifkan CSP via config(['csp.enabled' => false]).
  • Keyword::SELF: Wajib ditambahkan secara eksplisit untuk mengizinkan resource dari origin sendiri.

Intervention Image v2 → v3

// Old (v2)
Image::make($path)->resize(150, 150, function ($constraint) {
    $constraint->aspectRatio();
})->save($path.'.png', '100', 'png');

// New (v3)
Image::read($path)->scale(width: 150, height: 150)->save($path.'.png', quality: 100);

Carbon 3 Strict Types

Carbon 3 memiliki tipe parameter yang lebih ketat untuk semua method manipulasi waktu. Semua nilai integer dari env() adalah string, sehingga:

// Sebelum (string → error)
'decay_minutes' => env('RATE_LIMITER_DECAY_MINUTES', 1),

// Sesudah (int → safe)
'decay_minutes' => (int) env('RATE_LIMITER_DECAY_MINUTES', 1),

Konfigurasi yang berubah

File Perubahan
composer.json PHP ^8.3, Laravel ^13.0, semua dependency major update
config/csp.php Restruktur total — policypresets array, tambah nonce_enabled, report_only_*, dll
config/app.php (int) cast pada semua numeric env values + service provider/facade image baru
config/rate-limiter.php (int) cast pada max_attempts dan decay_minutes
config/image.php File baru untuk Intervention Image v3
config/jsvalidation.php View dari bootstrap4bootstrap, ignore diubah

Dependencies yang ditambahkan

  • intervention/image-laravel: ^1.2 (adapter Laravel untuk Intervention Image v3)

Dependencies yang dihapus

  • doctrine/dbal: Tidak diperlukan lagi di Laravel 11+

Testing

Manual Testing

  • Halaman login & autentikasi (termasuk OTP & 2FA)
  • Upload logo & favicon
  • CSP headers pada halaman normal & excluded routes
  • Halaman artikel & berita
  • Rate limiter pada OTP endpoints
  • Fitur CRUD dasar
  • php artisan optimize:clear berjalan clean
  • php artisan config:cache berjalan clean

Automated Testing

  • PHPUnit Test Suite: 405 tests, 1425 assertions, 0 failures
  • Unit Tests: 19/19 passing
  • CSP Policy Tests: 5/5 passing

Breaking Changes

  1. PHP 8.3 minimum required — environment harus menggunakan PHP 8.3 - 8.5
  2. Intervention Image v3 — kode yang menggunakan Image::make(), ->resize(), atau ->save($q, $fmt) harus diubah
  3. Spatie CSP v3 — config csp.php tidak kompatibel dengan versi 2; policy class harus diubah ke preset
  4. Carbon 3 strict types — kode yang melewatkan string ke method addDays(), addMinutes(), dll harus di-cast ke int

References

- Upgrade composer deps melalui 3 fase (L10→L11→L12→L13)
- Bump 12 package ke major version baru (slug, datatables, CSP, image, dll)
- Migrasi Intervention Image v2→v3 (Image::make → read, resize → scale)
- Migrasi Spatie CSP v2→v3 (Policy → Preset, addDirective → add, config format)
- Tambah helper csp_nonce() (dihilangkan di CSP v3)
- Tambah CspExclusion middleware untuk route exclusion
- Publikasikan ulang config/image.php, config/jsvalidation.php
- Update CustomCSPPolicy → CustomCspPreset implement Preset interface
- Update CSP test untuk v3 API
- Catat temuan post-upgrade di UPGRADE_LARAVEL_13_PLAN.md
@pandigresik pandigresik requested a review from affandii06 June 4, 2026 05:47
@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1050

@pandigresik

pandigresik commented Jun 4, 2026

Copy link
Copy Markdown
Contributor Author

upload file pada slider

simplescreenrecorder-2026-06-04_14.26.37.mp4

update logo aplikasi

simplescreenrecorder-2026-06-04_14.35.08.mp4

website presisi

simplescreenrecorder-2026-06-04_14.39.07.mp4

@habibie11

Copy link
Copy Markdown
Contributor

sudah oke, pengecekan detailnya akan dilakukan di #1051
image

@affandii06 affandii06 merged commit 77290fa into rilis-dev Jun 14, 2026
@affandii06 affandii06 deleted the upgrade/laravel-13 branch June 14, 2026 04:18
@affandii06 affandii06 added the Tingkat: T4 Lebih dari satu sprint, pertimbangkan untuk dipecah label Jun 14, 2026
@affandii06 affandii06 mentioned this pull request Jun 14, 2026
12 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Tingkat: T4 Lebih dari satu sprint, pertimbangkan untuk dipecah

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants