Universal Class Loader Phalcon

Phalcon \ Loader adalah komponen yang memungkinkan Anda untuk memuat kelas dalam proyek secara otomatis, berdasarkan pada beberapa aturan yang telah ditetapkan. Karena komponen ini ditulis dalam C, menyediakan beban terendah dalam membaca dan menafsirkan file PHP eksternal.

<?php

//Basic autoloader
spl_autoload_register(function($className) {
    if (file_exists($className . '.php')) {
        require $className . '.php';
    }
});

Perilaku komponen ini didasarkan pada kemampuan autoloading class PHP. Jika sebuah kelas yang tidak ada digunakan dalam setiap bagian dari kode, penangan khusus akan mencoba untuk memuatnya. Phalcon \ Loader berfungsi sebagai pengendali khusus untuk operasi ini. Dengan memuat kelas-kelas sesuai kebutuhan, kinerja secara keseluruhan meningkat karena satu-satunya pembacaan file hanya ketika file dibutuhkan. Teknik ini disebut lazy initialization .

Dengan komponen ini Anda dapat memuat file dari proyek atau vendor lainnya, autoloader ini sesuai dgn standar PSR-0.

Phalcon \ Loader menawarkan empat pilihan untuk autoload class. Anda dapat menggunakannya satu per satu atau menggabungkannya.

Mendaftarkan Namespace 

Jika Anda mengatur kode Anda menggunakan Namespace, atau library eksternal dgn namespace, registerNamespaces () menyediakan mekanisme autoloading. Melalui array asosiatif, key yang merupakan prefiks namespace dan value adalah direktori di mana kelas tsb berada. Separator namespace akan digantikan oleh pemisah direktori saat loader mencoba untuk menemukan kelas. Ingat selalu untuk menambahkan slash/garis-miring di akhir path.

<?php

// Creates the autoloader
$loader = new \Phalcon\Loader();

//Register some namespaces
$loader->registerNamespaces(
    array(
       "Example\Base"    => "vendor/example/base/",
       "Example\Adapter" => "vendor/example/adapter/",
       "Example"         => "vendor/example/",
    )
);

// register autoloader
$loader->register();

// The required class will automatically include the
// file vendor/example/adapter/Some.php
$some = new Example\Adapter\Some();

Registrasi Prefix 

Cara ini mirip dengan namespace. Dibutuhkan array asosiatif, key yang merupakan prefiks dan value-nya adalah direktori di mana class tsb berada. Separator namespace dan “_” karakter garis-bawah akan digantikan oleh pemisah direktori ketika loader mencoba untuk menemukan kelas. Ingat selalu untuk menambahkan garis-miring di path.

<?php

// Creates the autoloader
$loader = new \Phalcon\Loader();

//Register some prefixes
$loader->registerPrefixes(
    array(
       "Example_Base"     => "vendor/example/base/",
       "Example_Adapter"  => "vendor/example/adapter/",
       "Example_"         => "vendor/example/",
    )
);

// register autoloader
$loader->register();

// The required class will automatically include the
// file vendor/example/adapter/Some.php
$some = new Example_Adapter_Some();

Registrasi Direktori 

Pilihan ketiga adalah untuk mendaftar direktori, di mana class dapat ditemukan. Pilihan ini tidak dianjurkan dalam hal kinerja, karena Phalcon perlu melakukan sejumlah besar statistik file di setiap folder, mencari file dengan nama yang sama dengan kelas. Sangat penting untuk mendaftarkan direktori dalam urutan yg benar. Ingat selalu menambahkan garis miring di akhir path.

<?php

// Creates the autoloader
$loader = new \Phalcon\Loader();

// Register some directories
$loader->registerDirs(
    array(
        "library/MyComponent/",
        "library/OtherComponent/Other/",
        "vendor/example/adapters/",
        "vendor/example/"
    )
);

// register autoloader
$loader->register();

// The required class will automatically include the file from
// the first directory where it has been located
// i.e. library/OtherComponent/Other/Some.php
$some = new Some();

Registrasi Kelas 

Opsi terakhir adalah untuk mendaftarkan nama class dan path. Autoloader ini dapat sangat berguna ketika kesulitan mengambil file dengan menggunakan path dan nama kelas. Ini adalah metode autoloading tercepat. Namun aplikasi Anda akan terus tumbuh, semakin banyak kelas / file perlu ditambahkan untuk autoloader ini, yang secara efektif akan membuat pemeliharaan daftar kelas yang sangat rumit dan tidak dianjurkan.

<?php

// Creates the autoloader
$loader = new \Phalcon\Loader();

// Register some classes
$loader->registerClasses(
    array(
        "Some"         => "library/OtherComponent/Other/Some.php",
        "Example\Base" => "vendor/example/adapters/Example/BaseClass.php",
    )
);

// register autoloader
$loader->register();

// Requiring a class will automatically include the file it references
// in the associative array
// i.e. library/OtherComponent/Other/Some.php
$some = new Some();

Ekstensi file tambahan 

Beberapa strategi autoloading seperti “prefiks”, “namespace” atau “direktori” secara otomatis menambahkan ekstensi “php” pada akhir file yg diperiksa. Jika Anda menggunakan ekstensi tambahan Anda bisa mengaturnya dengan metode “setExtensions”. File diperiksa dalam urutan seperti yang didefinisikan:

<?php

 // Creates the autoloader
$loader = new \Phalcon\Loader();

//Set file extensions to check
$loader->setExtensions(array("php", "inc", "phb"));

Memodifikasi strategi yg berjalan 

Data auto-load tambahan dapat ditambahkan ke daftar yang telah ada dengan cara berikut:

<?php

// Adding more directories
$loader->registerDirs(
    array(
        "../app/library/",
        "../app/plugins/"
    ),
    true
);

Memberikan “true” sebagai parameter kedua akan menggabungkan nilai-nilai saat ini dengan yang baru dalam strategi/cara apapun.

Layer Keamanan 

Phalcon \ Loader menawarkan lapisan keamanan dgn men-sanitasi dengan nama kelas standar menghindari kemungkinan masuknya file yang tidak sah. Perhatikan contoh berikut ini:

<?php

//Basic autoloader
spl_autoload_register(function($className) {
    if (file_exists($className . '.php')) {
        require $className . '.php';
    }
});

Auto-loader diatas tak memiliki pemeriksaan keamanan, jika oleh kesalahan dalam fungsi yang memicu auto-loader, dapat mengeksekusi file lain yg bisa jadi berbahaya.

<?php

//This variable is not filtered and comes from an insecure source
$className = '../processes/important-process';

//Check if the class exists triggering the auto-loader
if (class_exists($className)) {
    //...
}

Jika ‘.. / Proses / penting-process.php’ adalah file yang valid, pengguna eksternal dapat mengeksekusi file tersebut tanpa otorisasi/login.

Untuk menghindari serangan ini atau paling canggih, Phalcon \ Loader menghapus semua karakter yang tidak sah dari nama kelas mengurangi kemungkinan diserang.

Event Autoloading  

Pada contoh berikut, EventsManager bekerja dengan loader kelas, memungkinkan kita untuk mendapatkan informasi debug mengenai aliran operasi:

<?php

$eventsManager = new \Phalcon\Events\Manager();

$loader = new \Phalcon\Loader();

$loader->registerNamespaces(array(
   'Example\\Base' => 'vendor/example/base/',
   'Example\\Adapter' => 'vendor/example/adapter/',
   'Example' => 'vendor/example/'
));

//Listen all the loader events
$eventsManager->attach('loader', function($event, $loader) {
    if ($event->getType() == 'beforeCheckPath') {
        echo $loader->getCheckedPath();
    }
});

$loader->setEventsManager($eventsManager);

$loader->register();

Beberapa event ketika mengembalikan boolean FALSE bisa menghentikan operasi yg sedang aktif. Event berikut ini yg didukung:

Nama Acara Dipicu Bisa menghentikan operasi?
beforeCheckClass Dipicu sebelum memulai proses autoloading Ya
pathFound Dipicu ketika loader locate kelas Tidak
afterCheckClass Dipicu setelah menyelesaikan proses autoloading. Jika acara ini diluncurkan autoloader tidak menemukan file kelas Tidak

Troubleshooting 

Beberapa hal yang perlu diingat ketika menggunakan autoloader yang universal:

  • Proses auto-loading case-sensitive, kelas akan dimuat seperti yang tertulis dalam kode
  • Strategi berdasarkan namespace/ prefiks lebih cepat daripada strategi direktori
  • Jika bytecode Cache seperti APC diinstal, ini akan digunakan untuk mengambil file yang diminta (sebuah caching implisit file dilakukan)

 

Terjemahan dr Universal Class Loader Phalcon
http://docs.phalconphp.com/en/latest/reference/loader.html