升级到 Laravel 5.5 后,数据加密在 Eloquent 模型中停止工作

Data encryption stoppped working in Eloquent model after upgrading to Laravel 5.5

我正在使用 elocryptfive 来加密数据库中的某些字段 - 简而言之,这是一个 PHP 特性,它在将标记为可加密的属性写入数据库之前对其进行加密,并在显示它们时对其进行解密给用户(使用 getAttribute 和其他此类方法)。

可以在 this laracasts discussion 中找到更简单的版本。

使用Laravel 5.5之前的版本没有任何问题。将站点升级到 laravel 5.5 后,我注意到应该加密的值反而以明文形式显示。

我已在包 github 帐户中提交问题,寻求帮助。与此同时,我尝试了一些事情:

  1. 在新安装的 laravel 5.2 和 5.4 中添加了 elocryptfive 软件包 - 加密工作正常
  2. 在库存中做同样的事 laravel 5.5 - 值仅在第一次保存后加密,并在每次后续更新后解密存储
  3. 我还没有在 forums/laracasts 中找到任何相关内容

这似乎与5.4和5.5之间的一些变化有关,我已经尝试比较Eloquent命名空间中的几个类但放弃了。

再次比较laravel/framework包中5.4和5.5标签之间的变化后,我在getDirty方法中找到了原因 src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php 特质。

在laravel 5.4中有:

foreach ($this->attributes as ...

然后在5.5中改为:

foreach ($this->getAttributes() as ...

由于 getAttributes 方法是解密数据的方法之一,看来目前最明智的解决方案是在加密特征或使用它的应用程序模型中覆盖 getDirty()

修改后的方法如下所示:

public function getDirty()
{
    $dirty = [];

    foreach ($this->attributes as $key => $value) {
        if (! $this->originalIsEquivalent($key, $value)) {
                    $dirty[$key] = $value;
        }
    }

    return $dirty;
}