PHPstorm - 无法在 blade.php 个文件中设置断点

PHPstorm - Unable to set breakpoints in blade.php files

我正在开发 Laravel 应用程序,可以很好地调试我的控制器 php 文件,但我还想调试 blade.php 文件。在我当前的设置中,我遵循了所有 jetbrains 推荐的 Laravel、(https://confluence.jetbrains.com/display/PhpStorm/Laravel+Development+using+PhpStorm#LaravelDevelopmentusingPhpStorm-DebuggingLaravelApplicationswithPhpStorm) 设置,但它仍然不允许我在 blade.php 文件中设置断点。

我可能遗漏了什么?

关闭此问题 - phpstorm 目前不支持此功能。 jetbrains 支持提供的解决方法是将 *.blade.php 添加到 IDE 设置中 PHP 下的文件类型关联,但是,这样做后它仍然对我不起作用。

看来他们应我的要求创建了 youtrack 票证,如果您想鼓励 jetbrains 在这方面工作,请投票:youtrack.jetbrains.com/issue/WI-26476

即使您可以获得 IDE 以在 blade 文件上启用断点,它也不会起作用 - Laravel 从 Blade 文件组成一个 PHP 文件 - 它是当脚本是 运行 时最终使用的这个文件 - 而不是 Blade 文件。

解决方法

这适用于 PHPStorm - 但在其他 IDEs 中可能会有类似的东西。

Laravel (5)将组合好的文件存放在storage/framework/views下。 这些文件具有随机生成的文件名 - 因此可能很难找到您想要的文件。 一个简单的方法是删除所有这些临时文件,然后刷新您要调试的页面。将创建一个新文件。 在 PHPstorm 中,您可以右键单击文件和 select 文件的扩展名类型。 (不确定其他 IDEs)

您现在可以设置断点了。显然,您需要在 Blade 文件中进行更改 - 但这至少可以帮助您找出问题所在。

**更新:Alex 的解决方案更简单! **

放一个

<?php xdebug_break(); ?>

到您的 blade 文件中效果很好。 即使在我的测试中,PHPstorm 在某些情况下也会跳转到下一个 PHP 语句。

为什么这有效:

Laravel 将 blade 文件处理为缓存文件夹中的普通 PHP 文件。但是 PHP 语句 xdebug_break(); 将被转移到那里并导致程序在您想要的位置停止(在缓存文件中)。

我设计了一个更好的 hack,它允许条件调试支持,这样你就不会永远被 XDebug_break 困住。

单行展开如下

<?php if ( \app\utils\DebugLogger::EnableForBlades ( ) ) xdebug_break ( ) ; ?>

此声明有几个不同寻常的特点。

  1. 由于 blade 文件没有使用指令,方法名称 \app\utils\DebugLogger::EnableForBlades 是完全限定的。
  2. 由于 blade 文件似乎不支持通常的代码阻塞机制,因此 one-line 语句没有大括号,并以分号结束。

EnableForBlades 是一种查询环境变量(在 .local.env 中定义的变量之一)的静态方法,如果该变量的计算结果为 True,则返回 True。否则,returns为假,xdebug_break被抑制。

  1. 转到您的 Jetbrains IDE 设置(Ctrl+Alt+S; +,;等)
  2. 语言和框架 > PHP > 调试 > 模板
  3. 在 Blade Debug > 缓存路径中输入:\path\to\app\storage\framework\views
  4. Enjoy