Spec-Zone.ru › Phalcon 2

Отладка приложений

../_images/xdebug-1.jpg

PHP предоставляет инструменты для отладки приложений с помощью сообщений об ошибках, предупреждений, ошибок и исключений. Класс Исключений предоставляет информацию, такую как файл, строка, сообщение, числовой код, стек вызовов и т. д. о месте возникновения ошибки. Такие фреймворки на основе объектно-ориентированного программирования, как Phalcon, в основном используют этот класс для инкапсуляции этой функциональности и предоставления информации разработчику или пользователю.

Несмотря на то, что написанный на C, Phalcon выполняет методы в пользовательской среде PHP, предоставляя возможность отладки, которая есть у любого другого приложения или фреймворка, написанного на PHP.

Перехват исключений

На протяжении руководств и примеров документации Phalcon есть общий элемент, который заключается в перехвате исключений. Это блок try/catch:

try {

    //... some phalcon/php code

} catch(\Exception $e) {

}

Любое исключение, брошенное внутри блока, будет перехвачено в переменной $e. Phalcon\Exception расширяет класс PHP Исключений и используется для определения, возникло ли исключение в Phalcon или самом PHP.

Все исключения, генерируемые 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 )

}

Получение информации из Phalcon\Exception аналогично получению информации из класса исключений 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();
}

Поэтому легко определить, какой файл и какая строка кода приложения сгенерировали исключение, а также компоненты, участвовавшие в генерации исключения:

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='[email protected]..')
#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}

Как видно из приведенного выше вывода, классы и методы Phalcon отображаются так же, как и любые другие компоненты, а также отображаются параметры, которые были вызваны в каждом вызове. Метод Exception::getTrace предоставляет дополнительную информацию при необходимости.

Компонент отладки

Phalcon предоставляет компонент отладки, который позволяет разработчику легко находить ошибки, возникающие в приложении, созданном с помощью фреймворка.

Следующий скринкаст поясняет, как это работает:

Для его активации добавьте следующее в свой bootstrap:

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

Все блоки Try/Catch необходимо удалить или отключить, чтобы этот компонент работал должным образом.

Рефлексия и интроспекция

Любой экземпляр класса Phalcon ведет себя точно так же, как и обычный класс PHP. Можно использовать API рефлексии или просто вывести любой объект, чтобы показать его внутреннее состояние:

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

Легко узнать внутреннее состояние любого объекта. Приведенный выше пример выводит следующее:

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
        (
        )
)

Использование XDebug

XDebug — это удивительный инструмент, который дополняет отладку PHP-приложений. Это также расширение C для PHP, и вы можете использовать его вместе с Phalcon без дополнительной конфигурации или побочных эффектов.

Следующий скринкаст демонстрирует сеанс Xdebug с Phalcon:

После установки xdebug вы можете использовать его API для получения более подробной информации об исключениях и сообщениях.

Мы настоятельно рекомендуем использовать как минимум XDebug 2.2.3 для лучшей совместимости с Phalcon

Следующий пример реализует xdebug_print_function_stack для остановки выполнения и генерации стека вызовов

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();
    }

}

В этом случае Xdebug также покажет нам переменные в локальном пространстве имен и стек вызовов:

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 предоставляет несколько способов получения информации об отладке и трассировке выполнения вашего приложения с использованием Phalcon. Более подробную информацию можно найти в документации XDebug.

© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/debug.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API