Отладка приложений
PHP предоставляет инструменты для отладки приложений с помощью сообщений, предупреждений, ошибок и исключений. Класс Exception предоставляет информацию, такую как файл, строка, сообщение, числовой код, трассировку стека и т. д., о том, где произошла ошибка. Такие фреймворки ООП, как Phalcon, в основном используют этот класс для инкапсуляции этой функциональности и предоставления информации разработчику или пользователю.
Несмотря на то, что Phalcon написан на C, он выполняет методы в пользовательском пространстве PHP, обеспечивая возможности отладки, которые есть у любого другого приложения или фреймворка, написанного на PHP.
Перехват исключений
На протяжении всех учебных пособий и примеров документации Phalcon есть общий элемент — перехват исключений. Это блок try/catch:
try {
// ... Some Phalcon/PHP code
} catch (\Exception $e) {
}
Любое исключение, сгенерированное внутри блока, перехватывается в переменной $e. Phalcon\Exception расширяет PHP-класс Exception и используется для понимания, возникло ли исключение в Phalcon или в самом PHP.
Все исключения, генерируемые PHP, основаны на классе Exception и имеют по крайней мере следующие элементы:
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:
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, чтобы остановить выполнение и сгенерировать трассировку стека:
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.
© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/debug.html