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

Tutorial PHP : Autoload class dengan Namespace dan Routingq

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 :

  1. Persiapan
  2. Autoload secara langsung 
  3. Autoload melalui halaman lain
  4. Contoh Pemanggilan antar class
  5. 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 :

  1. Buat sebuah direktori utama pada folder projek masing – masing
  2. Selanjutnya didalamnya buat folder SRC
  3. Didalam folder src buat beberapa folder Autoload, Controllers dan Models
  4. 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

  5. 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

  6. 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:

output dari autoloader

#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

output akses antar class bernamespace


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