elocryptfive 为了加密数据库中的某些字段,简而言之,PHP的一个特点是在将标记为可加密的属性写入数据库之前对其进行加密,并在向用户显示时对其进行解密(使用 getAttribute
getAttribute
更简单的版本可以在 this laracasts discussion
使用早于5.5的Laravel版本时没有任何问题。在将站点升级到laravel 5.5之后,我注意到原本应该加密的值被明文表示。
我已经在包github帐户中提交了问题,请求帮助。与此同时,我尝试了几件事:
Eloquent 但放弃了。
Eloquent
在再次比较了laravel/framework包中5.4和5.5标签之间的变化后,我在中找到了原因 getDirty 方法 src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php 特质
getDirty
src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php
foreach ($this->attributes as ...
foreach ($this->getAttributes() as ...
像 getAttributes 方法是解密数据的方法之一,目前看来最明智的解决方案是重写 getDirty() 无论是在加密特征还是在使用它的应用模型中。
getAttributes
getDirty()
修改后的方法如下所示:
public function getDirty() { $dirty = []; foreach ($this->attributes as $key => $value) { if (! $this->originalIsEquivalent($key, $value)) { $dirty[$key] = $value; } } return $dirty; }