Livewire 在尝试水合......组件时遇到损坏的数据

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

Livewire 在尝试水合……成分时遇到了损坏的数据。确保 Livewire 组件的 [name, id, data] 在请求之间未被篡改

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

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

预先感谢您,感谢您的帮助!


墨色风雨
浏览 66回答 7
7回答

元芳怎么了

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

智慧大石

要解决此问题,请打开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);

吃鸡游戏

无论如何,我们的问题是一个非常大的整数,大于 javascript 通过 Number.MAX_SAFE_INTEGER 可以处理的整数。我们在这里填写了错误报告:https://github.com/livewire/livewire/discussions/4788 (livewire 2.10.4)。因此,当使用太大的整数时,没有解决错误本身的方法。如果您想将您的值视为真正的整数,那么您现在运气不佳,但也许转换为字符串可能适合您。(和/或在 php 端进行计算 - 使用受保护的属性 - 如果在您的情况下可行)。话虽这么说,我们问题的真正原因是 uuid 转换为 int,因为我们没有填充protected $keyType = 'string';Laravel 模型的 ( https://laravel.com/docs/9.x/eloquent#primary-keys )!

慕码人8056858

我运行以下命令然后它解决了php artisan 优化

www说

除了上面其他人建议的之外,如果您有一个使用groupBy()可能是此问题原因的集合,也可能会发生这种情况,要修复此问题,请protected $attribute在组件中使用,而不是public传递$attribute到组件视图。protected $attribute;public function mount($attribute){   $this->attribute = $attribute;}...........public function render(){    return view('livewire.view-here',['attribute'=>$attribute]);}

慕雪6442864

在我的例子中,Livewire 组件引用了一个具有自定义属性的模型,该属性是使用Carbon::now()因此,每次组件尝试水合时,该属性都有不同的值,因此被“损坏”。

开心每一天1111

我这样做了,它对我有用:php artisan config:cache php artisan config:clear
打开App,查看更多内容
随时随地看视频慕课网APP