Debugging Aplikasi Phalcon

../_images/xdebug-1.jpg

PHP telah memberikan alat untuk debug aplikasi dengan pemberitahuan, peringatan, error dan eksepsi. class Exception menawarkan informasi seperti file, baris, pesan, kode angka, backtrace dll di mana kesalahan terjadi. Kerangka OOP seperti Phalcon menggunakan kelas ini terutama untuk merangkum fungsi ini dan memberikan informasi ke pengembang atau pengguna.

Meskipun ditulis dalam C, Phalcon mengeksekusi metode sebagaimana PHP, menyediakan kemampuan debug yang ditulis dgn PHP pada aplikasi lain atau framework lain.

Menangkap Eksepsi 

Sepanjang tutorial dan contoh-contoh dalam dokumentasi Phalcon, menggunakan satu cara yang sama untuk menangkap pengecualian. Yaitu try / catch:

<?php

try {

    //... some phalcon/php code

} catch(\Exception $e) {

}

Setiap eksepsi yg muncul dalam blok tsb ditangkap dalam variabel $e.  Class Phalcon \ Exception extend dr class Exception PHP dan digunakan untuk mengetahui apakah eksepsi berasal dari Phalcon atau PHP itu sendiri.

Semua eksepsi yang dihasilkan oleh PHP didasarkan pada kelas Exception , dan memiliki setidaknya unsur-unsur berikut:

<?php

class Exception
{

    /* Properties */
    protected string $message;
    protected int $code;
    protected string $file;
    protected int $line;

    /* Methods */
    public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]])
    final public string getMessage ( void )
    final public Exception getPrevious ( void )
    final public mixed getCode ( void )
    final public string getFile ( void )
    final public int getLine ( void )
    final public array getTrace ( void )
    final public string getTraceAsString ( void )
    public string __toString ( void )
    final private void __clone ( void )

}

Mengambil informasi dari Phalcon \ Exception sama dengan PHP Exception class :

<?php

try {

    //... app code ...

} catch(\Exception $e) {
    echo get_class($e), ": ", $e->getMessage(), "\n";
    echo " File=", $e->getFile(), "\n";
    echo " Line=", $e->getLine(), "\n";
    echo $e->getTraceAsString();
}

oleh karenanya mudah untuk menemukan dimana file dan baris kode aplikasi yang menyebabkan eksepsi, serta komponen yang terlibat dalam menghasilkan eksepsi tsb:

PDOException: SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost'
    (using password: NO)
 File=/Applications/MAMP/htdocs/invo/public/index.php
 Line=74
#0 [internal function]: PDO->__construct('mysql:host=loca...', 'root', '', Array)
#1 [internal function]: Phalcon\Db\Adapter\Pdo->connect(Array)
#2 /Applications/MAMP/htdocs/invo/public/index.php(74):
    Phalcon\Db\Adapter\Pdo->__construct(Array)
#3 [internal function]: {closure}()
#4 [internal function]: call_user_func_array(Object(Closure), Array)
#5 [internal function]: Phalcon\DI->_factory(Object(Closure), Array)
#6 [internal function]: Phalcon\DI->get('db', Array)
#7 [internal function]: Phalcon\DI->getShared('db')
#8 [internal function]: Phalcon\Mvc\Model->getConnection()
#9 [internal function]: Phalcon\Mvc\Model::_getOrCreateResultset('Users', Array, true)
#10 /Applications/MAMP/htdocs/invo/app/controllers/SessionController.php(83):
    Phalcon\Mvc\Model::findFirst('email='demo@pha...')
#11 [internal function]: SessionController->startAction()
#12 [internal function]: call_user_func_array(Array, Array)
#13 [internal function]: Phalcon\Mvc\Dispatcher->dispatch()
#14 /Applications/MAMP/htdocs/invo/public/index.php(114): Phalcon\Mvc\Application->handle()
#15 {main}

Seperti yang Anda lihat, output kelas Phalcon dan metodenya ditampilkan sama seperti komponen PHP lainnya, dan bahkan menunjukkan parameter yang diminta dalam setiap panggilan. Metode Exception :: getTrace dapat memberikan informasi tambahan jika diperlukan.

Komponen Debug 

Phalcon menyediakan komponen debug yang memudahkan pengembang untuk menemukan eksepsi yang dihasilkan dalam sebuah aplikasi yang dibuat dengan framework ini.

Lihat screencast berikut untuk tahu cara kerjanya:

Untuk mengaktifkannya, tambahkan kode berikut ini ke bootstrap Anda:

<?php

$debug = new \Phalcon\Debug();
$debug->listen();

Setiap blok Try/Catch harus dihapus atau dinonaktifkan agar komponen ini bekerja dengan benar.

Refleksi dan Introspeksi 

Setiap instance dari kelas Phalcon berperilaku sama persis dgn PHP normal. Anda bisa menggunakan API Reflection atau print_r() objek apapun untuk menunjukkan keadaan internalnya:

<?php

$router = new Phalcon\Mvc\Router();
print_r($router);

Sangat mudah untuk mengetahui keadaan internal objek apapun. Contoh di atas akan menghasilkan output berikut:

Phalcon\Mvc\Router Object
(
    [_dependencyInjector:protected] =>
    [_module:protected] =>
    [_controller:protected] =>
    [_action:protected] =>
    [_params:protected] => Array
        (
        )
    [_routes:protected] => Array
        (
            [0] => Phalcon\Mvc\Router\Route Object
                (
                    [_pattern:protected] => #^/([a-zA-Z0-9\_]+)[/]{0,1}$#
                    [_compiledPattern:protected] => #^/([a-zA-Z0-9\_]+)[/]{0,1}$#
                    [_paths:protected] => Array
                        (
                            [controller] => 1
                        )

                    [_methods:protected] =>
                    [_id:protected] => 0
                    [_name:protected] =>
                )

            [1] => Phalcon\Mvc\Router\Route Object
                (
                    [_pattern:protected] => #^/([a-zA-Z0-9\_]+)/([a-zA-Z0-9\_]+)(/.*)*$#
                    [_compiledPattern:protected] => #^/([a-zA-Z0-9\_]+)/([a-zA-Z0-9\_]+)(/.*)*$#
                    [_paths:protected] => Array
                        (
                            [controller] => 1
                            [action] => 2
                            [params] => 3
                        )
                    [_methods:protected] =>
                    [_id:protected] => 1
                    [_name:protected] =>
                )
        )
    [_matchedRoute:protected] =>
    [_matches:protected] =>
    [_wasMatched:protected] =>
    [_defaultModule:protected] =>
    [_defaultController:protected] =>
    [_defaultAction:protected] =>
    [_defaultParams:protected] => Array
        (
        )
)

Menggunakan XDebug 

XDebug adalah sebuah alat yang melengkapi debugging aplikasi PHP. Komponen juga merupakan C-extension untuk PHP, dan Anda dapat menggunakannya bersama-sama dengan Phalcon tanpa konfigurasi tambahan atau efek samping.

screencast berikut menunjukkan sesi Xdebug dengan Phalcon:

Setelah xdebug terinstal, Anda dapat menggunakan API untuk mendapatkan informasi lebih lanjut tentang eksepsi dan pesan.

Kami sangat menyarankan penggunaan setidaknya XDebug 2.2.3 untuk kompatibilitas yang lebih baik dengan Phalcon

Contoh berikut mengimplementasikan xdebug_print_function_stack untuk menghentikan eksekusi dan menghasilkan backtrace

<?php

class SignupController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function registerAction()
    {

        // Request variables from html form
        $name  = $this->request->getPost("name", "string");
        $email = $this->request->getPost("email", "email");

        // Stop execution and show a backtrace
        return xdebug_print_function_stack("stop here!");

        $user        = new Users();
        $user->name  = $name;
        $user->email = $email;

        // Store and check for errors
        $user->save();
    }

}

Dalam hal ini, Xdebug juga akan menunjukkan kepada kita variabel dalam lingkup lokal, dan backtrace juga:

Xdebug: stop here! in /Applications/MAMP/htdocs/tutorial/app/controllers/SignupController.php
    on line 19

Call Stack:
    0.0383     654600   1. {main}() /Applications/MAMP/htdocs/tutorial/public/index.php:0
    0.0392     663864   2. Phalcon\Mvc\Application->handle()
        /Applications/MAMP/htdocs/tutorial/public/index.php:37
    0.0418     738848   3. SignupController->registerAction()
        /Applications/MAMP/htdocs/tutorial/public/index.php:0
    0.0419     740144   4. xdebug_print_function_stack()
        /Applications/MAMP/htdocs/tutorial/app/controllers/SignupController.php:19

Xdebug menyediakan beberapa cara untuk mendapatkan debug dan melacak informasi mengenai pelaksanaan aplikasi Anda menggunakan Phalcon . Anda dapat memeriksa dokumentasi XDebug untuk informasi lebih lanjut.

Terjemahan dr Debugging Aplikasi Phalcon
http://docs.phalconphp.com/en/latest/reference/debug.html