03 Отладка
Отладка Приложений
PHP предлагает инструменты для отладки приложений с уведомлениями, предупреждениями, ошибками и исключениями. Класс Exception предоставляет такие сведения, как файл, строка, сообщение, числовой код, трассировка и т. д. о том, где произошла ошибка. Платформы ООП, такие как Phalcon, в основном используют этот класс для инкапсуляции этой функциональности и предоставления информации разработчику или пользователю.
Несмотря на то, что Phalcon написан на C, он выполняет методы в пользовательской среде PHP, обеспечивая отладочные возможности, которые есть у любого другого приложения или фреймворка, написанного на PHP.
Перехват Исключений
Во всех учебниках и примерах документации Phalcon есть общий элемент, перехватывающий исключения. Это блок try / catch:
<?php try { // ... Некоторый Phalcon/PHP код } catch (\Exception $e) { }
Любое исключение, выданное внутри блока, записывается в переменную $e
. Phalcon\Exception расширяет класс PHP Exception и используется, чтобы понять, пришло ли исключение из Phalcon или самого PHP.
Все исключения, генерируемые PHP, основаны на классе Exception, и имеют по крайней мере следующие элементы:
<?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 Exception:
<?php try { // ... Код приложения ... } 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='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}
Как вы можете видеть из приведенного выше вывода классы и методы Phalcon отображаются так же, как и любой другой компонент, и даже показывает параметры, которые были вызваны в каждом вызове. Exception::getTrace предоставляет дополнительные сведения при необходимости.
Отладочный компонент
Phalcon предоставляет отладочный компонент, который позволяет разработчику легко находить ошибки, возникающие в приложении, созданном с помощью платформы.
Следующий скринкаст объясняет, как это работает:
Чтобы включить его, добавьте в bootstrap следующее:
<?php $debug = new \Phalcon\Debug(); $debug->listen();
Любые блоки Try/Catch должны быть удалены или отключены, чтобы заставить этот компонент работать должным образом.
Отражение и самоанализ
Любой экземпляр класса Phalcon предлагает точно такое же поведение, что и обычный PHP. Можно использовать Reflection API или просто распечатать любой объект, чтобы показать, как его внутреннее состояние:
<?php $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_print_function_stack, чтобы остановить казнь и создать протокол сбоя:
<?php use Phalcon\Mvc\Controller; class SignupController extends 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.