Tags

, ,

Para veteran Yii1 pasti mengenal sintak Yii::import('application.models.*'). Sintak ini akan memastikan semua class di dalam folder protected/models akan menjadi autoloadible. Di Yii2 fitur ini sudah tidak dipakai lagi karena Yii2 telah menerapkan namespace secara menyeluruh dan menggunakan standar psr-0 dan psr-4 untuk autoloadible.
Bagi yang pingin bernostalgia dengan fitur ini, trik berikut bisa diterapkan.
Di file common/config/bootstrap.php (asumsi pakai template advance) tambahkan kode berikut

function import($namespace)
{
    static $registered = false;
    static $paths = [];
    static $classMap = [];

    if (!$registered) {
        spl_autoload_register(function($class) use(&$paths, &$classMap) {
            if (empty($paths) && empty($classMap)) {
                return;
            }
            if (strpos($class, '\\') === false) {
                if (isset($classMap[$class])) {
                    return class_alias($classMap[$class], $class);
                } else {
                    $baseFile = '/' . str_replace('_', '/', $class) . '.php';
                    foreach ($paths as $namespace => $path) {
                        if (is_file($path . $baseFile)) {
                            return class_alias($namespace . '\\' . $class, $class);
                        }
                    }
                }
            }
        });
        $registered = true;
    }
    if (($pos = strrpos($namespace, '\\')) !== false) {
        $ns = trim(substr($namespace, 0, $pos), '\\');
        $alias = substr($namespace, $pos + 1);
        if ($alias === '*') {
            if (!isset($paths[$ns]) || $paths[$ns] === false) {
                $paths[$ns] = Yii::getAlias('@' . str_replace('\\', '/', $ns), false);
            }
        } elseif (!empty($alias)) {
            $classMap[$alias] = trim($namespace, '\\');
        }
    } else {
        throw new yiibaseInvalidParamException("Invalid import alias: $namespace");
    }
}

Setelah itu cara penggunaannya (biasanya di view)

<?php
import('yii\bootstrap\Button');
import('yii\widgets\*');
?>
<?php

echo Button::widget([
    'label' => 'Action Test',
    'options' => ['class' => 'btn-lg'],
]);
?>
<?php Spaceless::begin(); ?>
<div>
    <span>ABCDE</span></div>
<?php Spaceless::end();?>

Disclaimer: Cara ini sama sekali tidak ane rekomendasikan. Sebaiknya gunakan IDE yang mendukung autocomplete untuk mempermudah koding :D.

Advertisements