Note
Jika file autoload gagal dimuat karena path salah ataupun sebab yang lain, aplikasi anda akan terus berjalan tanpa menampilkan error.
Autoloading memungkinkan anda untuk me-lazyload file kelas (memuat file kelas saat dibutuhkan saja)
tanpa secara eksplisit memanggil reuqire()
ataupun include()
.
Jadi, hanya kelas yang benar-benar anda butuhkan saja yang akan dimuat di aplikasi anda, dan anda bisa langsung menggunakan kelas yang anda mau tanpa harus capek-capek memuatnya secara manual.
Secara default, folder application/models/
dan application/libraries/
telah di autoload via
file application/boot.php
seingga anda tidak perlu capek meregistrasikannya secara manual.
Autoloader di rakit mengitkuti konvensi nama kelas sama dengan nama file
, dimana nama file
ditulis dengan huruf kecil seluruhnya.
Jadi misalnya, kelas User
yang ditaruh di folder models/
harus ditaruh didalam file
bernama user.php
agar bisa dimuat secara otomatis.
Anda juga boleh menaruhnya kedalam subfolder. Cukup beri namespace kelasnya mengikuti
struktur folder yang anda buat. Jadi, kelas Entities\User
harus ditaruh ke
file entities/user.php
didalam folder models/
.
Seperti yang sudah dijelaskan diatas, folder models/
dan libraries/
secara default
sudah didaftarkan ke autoload; tetapi, anda juga dapat mendaftarkan folder manapun yang anda
suka dengan menggunakan konvensi yang sama:
Autoloader::directories([
path('app').'classes',
path('app').'utilities',
]);
Terkadang anda mungkin ingin memetakan kelas secara manual ke file terkaitnya. Ini adalah cara memuat kelas yang paling efisien karena si autoloader tidak harus melakukan scanning folder untuk mencari dimana lokasi kelas anda berada:
Autoloader::map([
'Forms\Bootstrap' => path('app').'classes/forms/bootstrap.php',
'Forms\Bulma' => path('app').'classes/forms/bulma.php',
]);
Banyak library pihak ketiga menggunakan standar PSR-4 dan PSR-0 untuk meng-autoload kelasnya. PSR-4 dan PSR-0 menyatakan bahwa nama kelas harus cocok dengan nama file mereka, termasuk besar-kecil huruf dan struktur folder ditunjukkan oleh namespace.
Jika anda menggunakan library dengan konvensi seperti ini, cukup daftarkan root namespace dan lokasi foldernya ke autoloader. Rakit akan menangani sisanya.
Autoloader::namespaces([
'Doctrine' => path('libraries').'Doctrine',
]);
Sebelum fitur namespace ada di PHP, Banyak library yang menggunakan underscore sebagai indikator folder mereka.
Jika anda ingin menggunakan library dengan konvensi seperti ini, anda juga tetap bisa mendaftarkannya ke autoloader.
Contohnya, jika anda ingin menggunakan SwiftMailer
versi lama, anda pasti bisa perhatikan bahwa seluruh nama kelasnya diawali dengan Swift_
.
Jadi, yang perlu kita daftarkan ke autoloader adalah kata Swift
tersebut, dimana kata itu
adalah root namespace miliknya.
Autoloader::underscored([
'Swift' => path('libraries').'Swift_Mailer',
]);
Tentunya anda pernah menggunakan Composer. Composer umumnya
sudah membawa autoloader tersendiri, yang pada keadaan default terletak di vendor/autoload.php
.
Jadi, tugas kita disini hanya tinggal meng-include file tersebut ke aplikasi kita agar library yang diinstall olehnya bisa dkenali oleh rakit.
Caranya cukup mudah, cukup edit di file application/config/aplication.php
dan isi
opsi composer_autoload
dengan absolute path tempat file autoload itu berada.
Jadi misalkan file autoload anda berada di <root>/vendor/autoload.php
maka diisi seperti ini:
'composer_autoload' => path('base').'vendor/autoload.php',
Patut diingat bahwa pada keadaan default, tidak ada proteksi yang disediakan jika
folder vendor/
ditaruh di root folder, yang berarti seluruh file dan subfolder didalamnya
dapat diakses olek publik.
Hal ini tentu sangat berbahaya karena mereka akan tahu library apa saja yang anda gunakan. Untuk itu, kami menyediakan beberapa opsi untuk menangani hal ini:
Jika anda menggunakan Apache atau Nginx, ikuti panduan mempercantik url karena pada fitur tersebut, kami telah sekaligus menyediakan rule untuk memproteksi folder vendor.
Jika hosting anda memperbolehkan upload file ke folder diatas document root, taruh folder
vendor anda disitu, lalu ubah konfigurasi composer_autoload
anda menjadi seperti berikut:
'composer_autoload' => dirname(path('base')).'/vendor/autoload.php',
Dengan begitu, folder vendor anda tdak akan bisa diakses oleh publik dan anda tetap dapat menggunakan library yang anda install via composer.