Livewire 在尝试给…组件加水时遇到损坏的数据

Mar*_*ler 5 php laravel laravel-livewire

我收到以下错误并且有点迷失:

Livewire 在尝试对 ... 组件进行水合时遇到损坏的数据。确保 Livewire 组件的 [name, id, data] 在请求之间没有被篡改

情况如下:Livewire 2.x,Laravel 7.x,Component Controller 从 3 个 MySQL Stored Procedures 中获取数据并进行处理。组件刀片是一个非常基本的刀片,带有 foreach 循环。我正在使用 wire:init 功能,以便组件不会阻止页面加载。它包含一个定制的分页。切换到第二页数据时,出现这个错误。它在 Livewire 1.x 上没有出错。

有没有人知道如何解决这个问题?错误本身对我来说并没有多大意义。需要任何其他信息吗?

在此先感谢您,感谢您的帮助!

Mar*_*ler 18

在我的情况下,解决方案是保护公共财产并手动将其传递给刀片,因此它被排除在 Livewire 引擎盖下的自动处理之外。

  • 最佳答案!Livewire 仍然存在以不同值重新水合相同属性的问题。例如,如果您有收藏。然后你就变成了一个grouped集合。谢谢马库斯。 (7认同)
  • 这个答案救了我的命:)谢谢。 (2认同)

cby*_*016 15

要解决此问题,请打开vendor/livewire/livewire/src/ComponentChecksumManager.php 文件并var_dump($stringForHashing);在第19 行return 语句之前添加。然后,您可以看到正在散列的数据,并将其与之前的散列数据进行比较,以找出差异。

完成此操作后,我能够识别 javascript 重新排列的数字键并提出适当的修复方法。

需要注意的一件事是,某些 json 格式化程序也会对数字键重新排序,因此最好在不格式化或手动格式化的情况下比较 json。

编辑:使用 var_dump 可能会干扰某些页面的功能,因此将数据写入文件可能是更好的选择:

file_put_contents('/path/to/log.txt', $stringForHashing . "\n\n", FILE_APPEND);
Run Code Online (Sandbox Code Playgroud)


gor*_*hoa 7

无论如何,我们的问题是一个非常大的整数,大于 javascript 通过 Number.MAX_SAFE_INTEGER 可以处理的整数。

\n

我们在这里填写了错误报告:https://github.com/livewire/livewire/discussions/4788 (livewire 2.10.4)。

\n

因此,当使用太大的整数时,没有解决错误本身的方法。如果您想将您的值视为真正的整数,您\xe2\x80\x99 现在运气不佳,但也许转换为字符串可能适合您。(和/或在 php 端 \xe2\x80\x93 上使用受保护的属性 \xe2\x80\x93 进行计算(如果 \xe2\x80\x99s 在您的情况下可行)。

\n

话虽这么说,我们问题的真正原因是 uuid 转换为 int,因为我们没有填充protected $keyType = \'string\';Laravel 模型的 ( https://laravel.com/docs/9.x/eloquent#primary-keys )!

\n