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.
Pingback: Yii2: Import Namespace(2) | D Blog
Mustafa Qamar-ud-Din said:
Reblogged this on Qamar-ud-Din.
LikeLike