Tags

, , ,

Tulisan ini dimaksudkan hanya untuk pembelajaran. Memahami bagaimana cara kerja suatu framework. Untuk membuat aplikasi yang lebih serius, silakan menggunakan framework yang lebih serius juga seperti Yii2 misalnya.

Lanjutan dari tulisan sebelumnya Membuat Framework PHP Sederhana. Kali ini kita buat dengan full OOP. Di sini ada tiga class utama yaitu Dee, DApp dan DController.

class Dee

Class Dee adalah class helper. Fitur penting dari class ini adalah class autoloader. Dengan class autoloader kita tidak perlu menginclude file class secara manual. Dia akan secara otomatis membaca nama class kemudian mencari file yang mendefinisikan class itu dan meng-include-nya.

public static function autoload($class)
{
    if (isset(static::$classMap[$class])) {
        include static::$classMap[$class];
        return true;
    } else {
        foreach (self::$_paths as $i => $path) {
            if (strncmp($path, '@app/', 5) === 0) {
                self::$_paths[$i] = $path = static::$app->basePath . substr($path, 4);
            }
            if (is_file("{$path}/{$class}.php")) {
                include "{$path}/{$class}.php";
                return true;
            }
        }
    }
    return false;
}

Dee::$classMap = require(__DIR__ . '/classes.php');
spl_autoload_register(['Dee', 'autoload']);

class DApp

Class ini yang membaca url dan mencari controller yang tepat untuk dieksekusi

public function run()
{
    if ($this->baseUrl === null) {
        $this->baseUrl = $_SERVER['SCRIPT_NAME'];
    }

    $route = trim($_SERVER['PATH_INFO'], '/');
    if (empty($route)) {
        $route = $this->defaultRoute;
    }
    if (($pos = strpos($route, '/')) !== false) {
        $id = substr($route, 0, $pos);
        $route = substr($route, $pos + 1);
    } else {
        $id = $route;
        $route = '';
    }
    $class = str_replace(' ', '', ucwords(str_replace('-', ' ', $id))) . 'Controller';
    require ($this->basePath . "/controllers/{$class}.php");

    /* @var $controller DController */
    $controller = new $class($id);
    echo $controller->run($route);
}

Jika routenya adalah hello, maka controller yang dieksekusi adalah HelloController.

class DController

Base class untuk semua class controller. Dia akan mengarahkan action mana yang akan dieksekusi.
Jika routenya adalah hello/index maka controllenya adalah HelloController dan method yang dieksekusi adalah actionIndex().

public function run($route)
{
    $params = [];
    if ($route == '') {
        $route = $this->defaultAction;
    } elseif (($pos = strpos($route, '/')) !== false) {
        $params = explode('/', substr($route, $pos + 1));
        $route = substr($route, 0, $pos);
    }
    $this->route = $this->id . '/' . $route;
    $action = 'action' . str_replace(' ', '', ucwords(str_replace('-', ' ', $route)));
    return call_user_func_array([$this, $action], $params);
}

Class-class tambahan yang lain adalah DView, DUser dan DDbConnection. DView untuk merender layout, DUser untuk login dan logout serta DDbConnection untuk koneksi ke database. Untuk seting koneksi ada di file protected/config/main.php.

// di controller
public function actionIndex()
{
    $sql = 'select * from user where status=:status';
    $users = Dee::$app->db->queryAll($sql,[':status' => 10]);
    return $this->render('index', ['users' => $users]);
}
  • Source codenya bisa dilihat di github
Advertisements