Routing Closure PHP

20 January 2020

Pada tutorial ini kita akan coba membuat routing sederhana menggunakan anonymous function atau closure pada PHP.

routing-closure-php.png

<?php 

$app = new App();

$app->add('about', function(){
	echo 'About Page';
});

$app->run();


Pada contoh diatas, ketika misal kita mengakses https://ajatsudrajat.net/about maka anonymous function diatas akan dijalankan.

Untuk membuatnya, pertama buat dulu .htaccess dengan isi seperti berikut :



RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Kemudian buat class dengan isi seperti berikut ini :


<?php 

class App{
	
	public $url = [];
	public $routes = [];
	
	public function __construct(){
		$this->url = isset($_GET['url']) ? $_GET['url'] : 'home';
        $this->url = rtrim($this->url, '/');
        $this->url = explode('/', $this->url);
	}
	
	public function add($route, Closure $callback){
		$this->routes[$route] = $callback;
	}
	
	public function run(){
		if( array_key_exists($this->url[0], $this->routes)
		    && $this->routes[$this->url[0]] instanceof Closure
			&& is_callable($this->routes[$this->url[0]])){
			call_user_func($this->routes[$this->url[0]]);
		}
	}
}

Jika kita ingin menggunakan class App didalam anonymous function, kita tinggal tambahkan seperti ini.


<?php 

$app = new App();

$app->add('about', function() use (&$app){
	echo $app->url[0];
});

$app->run();

Diatas, parameter &$app adalah by-reference, artinya kita dapat manipulasi variable atau data dalam class App, jika hanya ingin mengambil nilainya aja tinggal ubah jadi by-value yaitu &app

Pada variable $url di class App merupakan array. Misalkan kita mengakses https://ajatsudrajat.net/about/portfolio

Maka isi array $url seperti ini :



$url[0] = about
$url[1] = portfolio
$url[2] = dst ...

Demikian, semoga tulisan ini bermanfaat.


Komentar