Laravel Blade 中的 {{dump('string')}} 输出值两次

cir*_*van 7 php dump echo laravel-5 laravel-blade

使用 Laravel 5.5.34,我在使用 dump() 帮助程序在 Blade 模板中输出调试信息时遇到问题。

{{ dump('test') }}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

截屏

我不希望原始字符串“test”出现在实际调试输出下方。这是正常行为吗?如果是,我该如何禁用它?如果不是,什么错误配置可能导致它?

cir*_*van 12

稍微深入一点,我找到了问题的根源。

首先,Blade 翻译了这个……

{{ dump($var) }}
Run Code Online (Sandbox Code Playgroud)

对此:

<?php echo e(dump($var)); ?>
Run Code Online (Sandbox Code Playgroud)

这一直工作得很好,因为 Symfony 的 dump() 助手从未返回过值。但是,他们通过此提交更改了这一点: https: //github.com/symfony/var-dumper/commit/b6d0c8cd9949a5de4e71413e6ffbc2ea9dcb647f#diff-2e42573e053ced723652b17a395226f0

从那时起, dump() 确实返回了$var

因为 Laravel 使用前面提到的来自 symfony/var-dumper 的 dump() 帮助器,所以 e() 现在会突然$var从 dump() 接收回来。

这是 Laravel 中使用的 e() 辅助函数:

function e($value, $doubleEncode = false)
{
    if ($value instanceof Htmlable) {
        return $value->toHtml();
    }

    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8', $doubleEncode);
}
Run Code Online (Sandbox Code Playgroud)

如果$var是字符串类型,这会导致双输出,如果不是字符串类型,则会引发异常,因为 htmlspecialchars() 只接受字符串作为第一个参数。

解决方案是创建我自己的转储助手,它不包含您可以在差异中看到的返回语句。

  • 请注意,“@dump”指令(Laravel 5.6)没有这个问题,因为它不使用“echo” (2认同)

Jay*_*enu 5

在较新版本的 Laravel 中,您可以使用该@dump()指令。