Rector - Automated Refactoring
Project ini menggunakan Rector untuk automated refactoring dan code quality/type checking.
Selain Rector official, starter kit ini juga menggunakan package driftingly/rector-laravel untuk rule khusus Laravel.
Kalau Pint adalah tool untuk merapikan gaya penulisan, maka Rector adalah tool untuk membantu merapikan struktur kode dan modernisasi sintaks.
Kenapa Saya Pakai Rector
Saat project berkembang, refactor kecil tapi banyak akan sering muncul:
- mengubah pola
if/elsemenjadi early return - menambahkan type declaration
- merapikan code smell sederhana
- mengikuti perubahan praktik terbaik versi PHP atau Laravel terbaru
Kalau semua dikerjakan manual, pekerjaan ini memakan waktu dan rawan terlewat.
Installation
Untuk menambahkan Rector di project:
composer require --dev rector/rector
composer require --dev driftingly/rector-laravel
File konfigurasi utama Rector ada di rector.php di root project.
Konfigurasi Rector
Contoh konfigurasi yang dipakai:
<?php
declare(strict_types=1);
use Rector\Config\RectorConfig;
use Rector\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector;
use RectorLaravel\Set\LaravelLevelSetList;
return RectorConfig::configure()
->withPaths([
__DIR__.'/app',
__DIR__.'/bootstrap/app.php',
__DIR__.'/database',
__DIR__.'/public',
])
->withSkip([
AddOverrideAttributeToOverriddenMethodsRector::class,
])
->withPreparedSets(
deadCode: true,
codeQuality: true,
typeDeclarations: true,
privatization: true,
earlyReturn: true,
strictBooleans: true,
)
->withSets([
LaravelLevelSetList::UP_TO_LARAVEL_120,
])
->withPhpSets();
Penjelasan Config
withPathsmenentukan folder atau file yang akan diproses RectorwithSkipmenentukan rule yang sengaja tidak dijalankanwithPreparedSetsmengaktifkan kumpulan rule resmi RectorwithSetsmengaktifkan preset khusus LaravelwithPhpSetsmenyesuaikan rule dengan versi PHP yang dipakai
Penjelasan withPreparedSets
deadCodeuntuk menghapus kode yang tidak terpakaicodeQualityuntuk meningkatkan kualitas struktur kodetypeDeclarationsuntuk menambahkan type hintsprivatizationuntuk mengubah property atau method yang seharusnya privateearlyReturnuntuk merapikan flow kondisistrictBooleansuntuk mendorong perbandingan boolean yang lebih aman
Studi Kasus
Misalnya Anda punya banyak action lama yang ditulis sebelum project lebih disiplin terhadap type declaration. Rector bisa membantu:
- menambahkan beberapa type hints otomatis
- merapikan branch yang terlalu dalam
- menemukan pola code smell sederhana
Tetapi saya tetap menekankan: Rector adalah alat bantu, bukan pengganti pemahaman kode.
Menjalankan Rector
Dry-run
composer test:refactor
atau:
vendor/bin/rector process --dry-run
Apply fixes
composer refactor
atau:
vendor/bin/rector process
Pastikan commit semua perubahan penting sebelum menjalankan
rector process, karena hasil refactor bisa cukup banyak.
Menghapus driftingly/rector-laravel
Jika ingin remove package Laravel khusus:
composer remove driftingly/rector-laravel
Efeknya
- preset
LaravelLevelSetList::UP_TO_LARAVEL_120tidak bisa dipakai lagi - Rector tetap bisa berjalan untuk rule default
- Laravel-specific refactor tidak akan aktif
- jika konfigurasi
withSets([LaravelLevelSetList::...])tetap dibiarkan, Rector akan error
Tips
- Jalankan dry-run dulu sebelum apply.
- Gunakan commit terpisah untuk hasil Rector.
- Review diff dengan hati-hati, terutama di file bisnis penting.
- Jangan pakai Rector sebagai alasan untuk menghindari review manual.
Kesimpulan
Rector sangat membantu menjaga project tetap modern, tetapi tetap harus dipakai dengan sadar. Saya menggunakannya sebagai "asisten refactor", bukan sebagai pihak yang saya percaya 100% tanpa verifikasi.