Tutorial PHP : Autoload class dengan Namespace dan Routing
Autoload bisa dibilang merupakan istilah teknis yang menggambarkan tentang bagaimana file – file dipanggil dalam sebuah aplikasi. Tujuan dari proses autoload tersebut tentunya untuk mempermudah pemanggilan file, dalam kasus tertentu file yang telah di panggil menggunakan autoloader tersebt akan di rutekan, di routing atau bisa dibilang dikelompokan pemanggilannya berdasarkan alamat – alamat yang sudah ditentukan didalam script/module routing aplikasi.
Sebelum membahas membahas ini lebih jauh lagi silahkan lihat refrensi Standar PSR4 Autoload selanjutnya nanti silahkan juga unduh phprouter karena kita akan melakukan implementasi autoload kelas dengan namespace yang selanjutnya di routing berdasarkan library phprouter
STUDI KASUS
Pertama disini kita akan mencoba terlebih dahulu sebuah percobaan sederhana dengan membuat sebuah class – class dengan namespace kemudian dipanggil melalui autoloader. Sebenarnya ada dua contoh yang bisa kita implementasikan dari refrensi PSR 4 yaitu Closure dan Class tetapi kali ini saya hanya akan memberikan contoh yang sederhana dari contoh pertama yaitu Closure
STRUKTUR DIREKTORI
Dalam proses pembuatan autoloader penting sekali kita sebagai programmer untuk mengetahui struktur atau susunan direktori yang kita miliki. Dimisilkan disini strukur direktori kita sebagai berikut
Selanjutnya kita perlu melakukan beberapa uji coba untuk mempraktikan konsep autoload sebuah class dengan namespace menggunakan beberapa metode
METODE & PRAKTIK
Ada beberapa point yang akan dibahas atau dipraktikan dalam percobaan kali ini diantaranya :
- Persiapan
- Autoload secara langsung
- Autoload melalui halaman lain
- Contoh Pemanggilan antar class
- Menempatkan Hasil Autoload pada Routing
Untuk Autoload sendiri memiliki 2 contoh yang terdapat pada refrensi Standar PSR4 Autoload yaitu Closure dan Class dimana disini saya akan menggunakan metode atau contoh yang pertama yaitu Closure yang menurut saya lebih sederhana
#1 Persiapan
Sebelum kita mulai melakukan praktik pengeloaan class yang ber-namespace, maka lakukan langkah - langkah berikut sebagai persiapan :
- Buat sebuah direktori utama pada folder projek masing – masing
- Selanjutnya didalamnya buat folder SRC
- Didalam folder src buat beberapa folder Autoload, Controllers dan Models
- Pada folder Models buatlah beberapa file Mahasiswa.php dan User.php seperti dibawah ini
<?php //User.php namespace App\Models; class User { public function sayHello() { echo "Hello, I am a User!"; } }
Contoh kode 1.1 pada class User pada namespace App\Models
<?php //Mahasiswa.php namespace App\Models; class Mahasiswa{ public function sayaMhs() { echo "Saya mahasiswa"; } }
Contoh kode 1.2 pada class Mahasiswa pada namespace App\Models
- Pada Folder controllers buat file bernama misal Guruclass.php
<?php namespace App\Controllers; class Guruclass { public function sayaGuru() { echo "Saya guru cantik :)"; } }
Contoh kode 1.3 pada class Guruclass pada namespace App\Controllers
- Pada folder Autoload nanti kita akan isi dengan sebuah file dengan nama Psr4Autoloader.php
<?php // src/autoload/autoload.php spl_autoload_register(function ($class) { // Namespace prefix $prefix = 'App\\'; // Base directory for the namespace prefix $base_dir = __DIR__ . '/../'; // Sesuaikan path dengan struktur direktori Anda // Check if the class uses the namespace prefix $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { return; } // Get the relative class name $relative_class = substr($class, $len); // Replace namespace prefix with the base directory, replace namespace separators with directory separators, append .php $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; // If the file exists, require it if (file_exists($file)) { require $file; } });
Contoh kode 1.4 autoloader untuk class ber-namespace pada file Autoloader
#2 Autoload secara langsung
Selanjutnya disini kita akan mengujicoba autoload secara langsung melalui halaman index, maksudnya autoload tidak akan ditempatkan pada halaman lain tetapi kita akan mengujinya secara langsung pada halaman secara langsung
Contoh :
<?php
spl_autoload_register(function ($class) {
// Namespace prefix
$prefix = 'App\\';
// Base directory for the namespace prefix
$base_dir = __DIR__ . '/src/'; // Sesuaikan path dengan struktur direktori Anda
// Check if the class uses the namespace prefix
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
// Get the relative class name
$relative_class = substr($class, $len);
// Replace namespace prefix with the base directory, replace namespace separators with directory separators, append .php
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
// If the file exists, require it
if (file_exists($file)) {
require $file;
}
});
use App\Models\User;
$user = new User();
$user->sayHello();
Contoh kode 1.5 autoloader secara langsung pada file index.php
Output dari script diatas akan terlihat seperti berikut:
#3 Autoload melalui halaman
Pada metode kedua ini autoloader akan kita panggil melalui halaman lain. Anda bisa melihat contoh penerapan kodenya sebagai berikut :
<?php
require_once __DIR__ . '/src/Autoload/Psr4Autoloader.php';
use App\Models\User;
$user = new User();
$user->sayHello();
#4 Contoh Pemanggilan antar Class
Dimisalkan pada file Mahasiswa.php yang terdapat pada folder models ingin mengakses class yang terdapat pada Guruclass.php yang terdapat pada folder controllers, maka kita bisa menggunakan beberapa cara, bisa menggunakan extends atau dengan memasukan objek ke konstruktor. Pada intinya konsep pemanggilan ini adalah cara yang biasa dilakukan dalam pemanggilan class tanpa namesapce atau pada konsep oop php pada umumnya.
Perhatikan pada contoh file Mahasiswa.php berikut :
Contoh kode 4.1 mengakses class lain dengan extends
<?php
//Mahasiswa.php
namespace App\Models;
use App\Controllers\Guruclass;
//mengakses function atau method dari Guruclass dengan extends
class Mahasiswa extends Guruclass{
public function sayaMhs()
{
echo "Saya adalah class ".__CLASS__;
}
}
<?php
//index.php
require_once __DIR__ . '/src/Autoload/Psr4Autoloader.php';
use App\Models\Mahasiswa;
$mahasiswa = new Mahasiswa();
$mahasiswa->sayaMhs();
echo "<br/>";
$mahasiswa->sayaGuru();
Output kode 4.1
Contoh kode 4.2 mengakses class lain dengan menempatkan objek didalam konstruktor
<?php
namespace App\Models;
use App\Controllers\Guruclass;
class Mahasiswa{
private $guru;
public function __construct()
{
$this->guru= new Guruclass;
}
public function sayaMhs()
{
echo "Saya adalah class ".__CLASS__;
echo"<br/>";
$this->guru->sayaGuru();
}
}
<?php
//index.php
require_once __DIR__ . '/src/Autoload/Psr4Autoloader.php';
use App\Models\Mahasiswa;
$mahasiswa = new Mahasiswa();
$mahasiswa->sayaMhs();
echo "<br/>";
#5 Menempatkan Hasil Autoload pada Routing
Selanjutnya kita akan melakukan uji coba dengan menempatkan class – class yang telah diload tersebut didalam sebuah routing. Silahkan terlebih dahulu mengunduh library untuk routing dari halaman phprouter
<?php
require_once __DIR__ . '/app/Autoloader/Psr4Autoloader.php';
require_once __DIR__.'/app/route/router.php';
get('/', function(){
echo "Hello world :)";
});
get('/create','/../../app/views/crud.php');
//Callback with closure or array
get('/create', function() use($mhs) {
});
post('/create/proses',function(){
$obj = new App\Controllers\Mahasiswaclass;
$obj->proses();
};
KESIMPULAN
- Fungsi autoloader melalui fungsi php spl_autoload_register sangatlah berguna untuk mempermudah kita dalam meload file - file yang secara lebih efisien, mempermudah hubungan antar file atau class yang saling membutuhkan satu sama lain.
- Metode yang digunakan dalam contoh diatas untuk meregister class yaitu menggunakan Closure. Untuk metode yaitu menggunakan metode autoload dengan class mungkin akan saya bahas pada kesempatan berikutnya
- Dalam proses manajemen file dengan autoload, kita perlu paham tentang struktur direktori atau folder yang kita buat. Misal ketika autoloader dijalankan pada root direktori projek maka $base_dir perlu di set ke file/direktori folder dimana class diletakan $base_dir=__DIR__ . '/src/'; tetapi jika autoloader diletakan sejajar dalam folder misalnya disini Folder SRC maka path pada $base_dir di set sejajar dengan folder lain yang berarti nilai variabel $base_dir= __DIR__ . '/../';
0 Response to "Tutorial PHP : Autoload class dengan Namespace dan Routing"
Post a Comment
Komentar yang Anda kirim akan terlebih dahulu di moderasi oleh Admin