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

Posted

技术标签:

【中文标题】PHPstorm - 无法在blade.php 文件中设置断点【英文标题】:PHPstorm - Unable to set breakpoints in blade.php files 【发布时间】:2015-04-14 13:58:21 【问题描述】:

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

我可能会错过什么?

【问题讨论】:

在什么文件中——原始.blade.php 或编译的刀片文件?你绝对不能把它设置成原来的——因为它没有被执行。 感谢您的快速响应,我不知道它是单独编译和生成的。是的,我指的是原始的blade.php 文件。那么在编译文件中调试 php 变量的最佳方法是什么? 我认为 PhpStorm 在调试实际编译的刀片文件时存在一些问题(由于文件的命名方式以及 IDE 的工作方式:此类文件没有扩展名,IDE 无法将它们与 PHP files 关联文件类型,以便能够放置断点等)。请参考这张票:youtrack.jetbrains.com/issue/WI-25835 调试器无法评估刀片语法(因为解释器是在 Laravel 中实现的)。虽然 PHPStorm 确实在一定程度上支持 Blade 模板,但它不能在 blade.php 文件中放置断点,除非代码在 <?php ... ?> 内。 最好看看这个:youtrack.jetbrains.com/issue/WI-26476 【参考方案1】:

放一个

<?php xdebug_break(); ?>

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

为什么会这样:

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

【讨论】:

哇 - 我刚刚有机会使用它,效果很好 - 谢谢 Alex 我发现这个技巧也适用于在 PHPstorm 中调试 .thtml 文件。非常感谢! 同样的技巧在 XDebug 中有效,使用任何支持它的 IDE。我将它与 UltraEdit Studio 一起使用,尽管它应该可以在你最喜欢的 IDE 中工作,甚至是我最不喜欢的 Eclipse。 太甜了。也可以在 Gitpod (THEIA) 中使用!打开带有名称哈希的 php 文件,并将所有刀片逻辑转换为 php 标签。谢谢@Alex!!【参考方案2】:

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

他们似乎是应我的要求创建了一张 youtrack 票,如果你想鼓励 jetbrains 进行这项工作,请投票:youtrack.jetbrains.com/issue/WI-26476

【讨论】:

【参考方案3】:
    转到您的 Jetbrains IDE 设置 (Ctrl+Alt+S; +, ;等等) 语言和框架 > PHP > 调试 > 模板 进入刀片调试>缓存路径:\path\to\app\storage\framework\views Enjoy

【讨论】:

【参考方案4】:

即使您可以让 IDE 在刀片文件上启用断点,它也不起作用 - Laravel 从刀片文件组成一个 PHP 文件 - 最终在脚本运行时使用这个文件 - 而不是刀片文件。

解决方法

这适用于 PHPStorm - 但在其他 IDE 中可能会出现类似的情况。

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

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

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

【讨论】:

可能无法设置断点,因为它们没有 .php 扩展名。这就是我为此提出拉取请求的原因:github.com/laravel/framework/pull/10462 - 缓存文件名也不是随机的 - 它是视图文件路径的 md5 哈希。【参考方案5】:

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

单行展开如下。

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

这句话有几个不同寻常的特点。

    由于刀片文件没有 use 指令,因此方法名称 \app\utils\DebugLogger::EnableForBlades 是完全限定的。 由于刀片文件似乎缺乏对通常代码阻塞机制的支持,因此单行语句没有大括号,并以分号结束。

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

【讨论】:

以上是关于PHPstorm - 无法在blade.php 文件中设置断点的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Laravel (blade.php) 加载具有较长链接的样式

无法在 Blade 中使用 jQuery

如何在blade.php中使用vue获取字段的旧值

当我在 Laravel 5.2 中进行身份验证时,我无法访问关于页面

无法访问@include 之外的变量

在 Laravel 4 / Blade 中将布局分解为部分