Langsug saja, kemarin saat akan memulai project baru di tempat kerja dengan Yii Framework. Saya menemukan sebuah problem yang cukup membuat pusing hampir seharian (maklum newbie hehe). Problemnya adalah saya harus mengintegrasikan sebuah API dengan banyak class dalam satu file agar bisa dipakai didalam lingkungan Yii Framework. Seperti yang kita ketahui bahwa konvensi (aturan) untuk pembuatan class di Yii Framework adalah one public class put in on file and name of public class must be same with file name. Ceritanya berbagai cara saya coba lakukan dari memecah class kedalam file-file berbeda, menjadikannya sebuah ekstention, sampai tindakan ekstrim mengedit file YiiBase.php (biasa hasil googling) ... namun sayang masih gagal..
Oke fine, seperti yang kita ketahui bahwa untuk meng-autoload class di Yii Framework cukup menset config pada file main.php seperti berikut ini :
'import'=>array(
'path.to.classname' //'application.component.MyClass'
)
Beda kasus kalau dalam satu file terdapat banyak public class ( class yang bisa kita gunakan di class lain). So pasti saat kamu akan menggunakan class tersebut misalnya dalam sebuah controller akan menghasilkan sebuah php Warning yang aduhai..
Masuk ke solusi, singkatnya saya menemukan sebuah pencerahan dari sahabat sejati programmer newbie kaya saya (sebut saja stackoverflow). kurang lebih caranya adalah saya meggunakan fungsi spl_autoload_register .
1. Buat file autoload.php (misal di folder vendor)
spl_autoload_register(function($className) {
static $classMap;
if (!isset($classMap)) {
$classMap = require __DIR__ . DIRECTORY_SEPARATOR . 'classmap.php';
}
if (isset($classMap[$className])) {
include $classMap[$className];
}
});
2. Buat file classmap.php ( letakkan satu dir dengan autoload.php, file ini yang mendaftarkan nama public class dan nama file dimana ia berada)
/**
* A map of classname => filename for SPL autoloading.
*/
$mainDir = __DIR__ . DIRECTORY_SEPARATOR . 'main' . DIRECTORY_SEPARATOR;
$childDir = $mainDir . 'child' . DIRECTORY_SEPARATOR;
return array(
'MyClassName1' => $mainDir . 'filename1.php',
'MyClassName2' => $mainDir . 'filename1.php',
'MyClassName3' => $childDir . 'filename2.php',
'MyClassName4' => $childDir . 'filename2.php',
);
3. Edit file index.php ( require file autoload.php sebelum yii.php)
$yii=dirname(__FILE__).'/../yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';
// remove the following lines when in production mode
//defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log message
//defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
require '/protected/vendor/autoload.php';
require_once($yii);
Yii::createWebApplication($config)->run();
4. Oke coba deh gunakan class yang udah kita autoload (misalnya di contoller)
class MyController extends Controller {
public function actionIndex(){
$tw = new MyClassName2();
$tw->myMethod();
}
}
5. Berhasil.. hore - hore...
Mungkinkah ada solusi lain, ditunggu sarannya pada kotak komentar ? apakah dengan composser, dan sebagainya....
Sekian postingan saya kali ini.. semoga bermanfaat..
NB: Sekedar catatan pribadi.
API yang dipakai pada project ini gak support composser.. ya sudahlah..