调试

调试是任何开发周期中不可避免且必要的组成部分。虽然 CakePHP 没有提供任何直接连接到任何 IDE 或编辑器的工具,但它确实提供了一些工具来帮助调试和暴露应用程序内部运行的情况。

基本调试

debug(mixed $var, boolean $showHtml = null, $showFrom = true)

debug() 函数是一个全局可用的函数,其工作方式类似于 PHP 函数 print_r()。该函数允许您以多种方式显示变量的内容。首先,如果您希望数据以 HTML 友好的方式显示,请将第二个参数设置为 true。该函数默认情况下还会打印出其来源的行号和文件名。

只有在核心 $debug 变量被设置为 true 时,才会显示来自此函数的输出。

另请参阅 dd()pr()pj()

stackTrace()

stackTrace() 函数在全局范围内可用,允许您在任何调用该函数的地方输出堆栈跟踪。

breakpoint()

如果您安装了 Psysh,则可以在 CLI 环境中使用此函数来打开一个带有当前局部作用域的交互式控制台。

// Some code
eval(breakpoint());

将打开一个交互式控制台,可用于检查局部变量并执行其他代码。您可以在交互式调试器中运行 quitq 来退出交互式调试器并恢复原始执行。

使用 Debugger 类

class Cake\Error\Debugger

要使用调试器,首先要确保 Configure::read('debug') 设置为 true。您可以在 **config/app.php** 文件中使用 filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN), 来确保 debug 是一个布尔值。

以下配置选项可以在 **config/app.php** 中设置,以更改 Debugger 的行为

  • Debugger.editor 选择要使用的编辑器 URL 格式。默认情况下,atom、emacs、macvim、phpstorm、sublime、textmate 和 vscode 都可用。您可以在应用程序启动过程中使用 Debugger::addEditor() 添加其他编辑器链接格式。

  • Debugger.outputMask 一个 keyreplacement 值的映射,Debugger 应该在由 Debugger 生成的转储数据和日志中替换。

输出值

static Cake\Error\Debugger::dump($var, $depth = 3)

Dump 打印出变量的内容。它将打印出所提供变量的所有属性和方法(如果有)。

$foo = [1,2,3];

Debugger::dump($foo);

// Outputs
array(
    1,
    2,
    3
)

// Simple object
$car = new Car();

Debugger::dump($car);

// Outputs
object(Car) {
    color => 'red'
    make => 'Toyota'
    model => 'Camry'
    mileage => (int)15000
}

数据遮蔽

在使用 Debugger 转储数据或渲染错误页面时,您可能希望隐藏敏感键,例如密码或 API 密钥。在您的 **config/bootstrap.php** 文件中,您可以遮蔽特定的键。

Debugger::setOutputMask([
    'password' => 'xxxxx',
    'awsKey' => 'yyyyy',
]);

从 4.1.0 版本开始,您可以使用 Debugger.outputMask 配置值来设置输出遮蔽。

带堆栈跟踪的日志记录

static Cake\Error\Debugger::log($var, $level = 7, $depth = 3)

在调用时创建一个详细的堆栈跟踪日志。该方法打印出的数据类似于 Debugger::dump() 所做的事情,但打印到 debug.log 而不是输出缓冲区。请注意,您的 **tmp** 目录(及其内容)必须对 Web 服务器可写,log() 才能正常工作。

生成堆栈跟踪

static Cake\Error\Debugger::trace($options)

返回当前堆栈跟踪。跟踪的每一行都包含调用方法,包括调用源自哪个文件和哪一行。

// In PostsController::index()
pr(Debugger::trace());

// Outputs
PostsController::index() - APP/Controller/DownloadsController.php, line 48
Dispatcher::_invoke() - CORE/src/Routing/Dispatcher.php, line 265
Dispatcher::dispatch() - CORE/src/Routing/Dispatcher.php, line 237
[main] - APP/webroot/index.php, line 84

以上是在控制器操作中调用 Debugger::trace() 生成的堆栈跟踪。从下到上阅读堆栈跟踪显示了当前正在运行的函数(堆栈帧)的顺序。

从文件中获取摘录

static Cake\Error\Debugger::excerpt($file, $line, $context)

从 $path(这是一个绝对文件路径)中的文件获取摘录,突出显示行号为 $line 的行,并包含周围 $context 行。

pr(Debugger::excerpt(ROOT . DS . LIBS . 'debugger.php', 321, 2));

// Will output the following.
Array
(
    [0] => <code><span style="color: #000000"> * @access public</span></code>
    [1] => <code><span style="color: #000000"> */</span></code>
    [2] => <code><span style="color: #000000">    function excerpt($file, $line, $context = 2) {</span></code>

    [3] => <span class="code-highlight"><code><span style="color: #000000">        $data = $lines = array();</span></code></span>
    [4] => <code><span style="color: #000000">        $data = @explode("\n", file_get_contents($file));</span></code>
)

虽然此方法在内部使用,但如果您正在为自定义情况创建自己的错误消息或日志条目,它会很方便。

static Cake\Error\Debugger::getType($var)

获取变量的类型。对象将返回它们的类名。

编辑器集成

异常和错误页面可以包含直接在您的编辑器或 IDE 中打开的 URL。CakePHP 附带了几个流行编辑器的 URL 格式,您可以在应用程序启动过程中根据需要添加其他编辑器格式。

// Generate links for vscode.
Debugger::setEditor('vscode')

// Add a custom format
// Format strings will have the {file} and {line}
// placeholders replaced.
Debugger::addEditor('custom', 'thing://open={file}&line={line}');

// You can also use a closure to generate URLs
Debugger::addEditor('custom', function ($file, $line) {
    return "thing://open={$file}&line={$line}";
});

使用日志记录进行调试

记录日志是调试应用程序的另一种好方法,您可以使用 Cake\Log\Log 在您的应用程序中进行日志记录。所有使用 LogTrait 的对象都具有一个实例方法 log(),它可以用来记录消息

$this->log('Got here', 'debug');

上面的代码会将 Got here 写入调试日志。您可以使用日志条目来帮助调试涉及重定向或复杂循环的方法。您也可以使用 Cake\Log\Log::write() 来写入日志消息。此方法可以在加载 Log 后的应用程序的任何位置静态调用。

// At the top of the file you want to log in.
use Cake\Log\Log;

// Anywhere that Log has been imported.
Log::debug('Got here');

Debug Kit

DebugKit 是一个插件,提供了许多优秀的调试工具。它主要在渲染的 HTML 中提供一个工具栏,该工具栏提供了关于您的应用程序和当前请求的大量信息。请参见 DebugKit 文档 了解如何安装和使用 DebugKit。