在Laravel中保存加密数组时出现了一个奇怪的错误。即使调用save(),该模型也不会更新。
没有控制台或SQL错误。 禁用加密后,将没有错误,并且模型将成功更新。
在控制器中,我这样调用模型:
$userData = UserData::where('user_id', $user_id)->first();
然后我拉数组:
$encryptedData = $userData->app_data;
我想添加到这个数组中,例如
$encryptedData['new'] = 'axy';
$encryptedData['time'] = time();
然后我更新模型并保存:
$userData->app_data = $encryptedData;
$userData->save();
但是,这里是问题开始的地方。模型不会更新。好像什么都没有发生。因此,如果我执行refresh(),则将获得与从未添加两个新条目相同的数据。当我登录时,它看起来像这样:
Array
(
[token] => xyz
[access_token] => abc
)
添加两个新条目后:
Array
(
[token] => xyz
[access_token] => abc
[new] => 'axy'
[time] => 1234
)
在save()和refresh()之后:
Array
(
[token] => xyz
[access_token] => abc
)
模型如下:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Contracts\Encryption\DecryptException;
class UserData extends Model
{
protected $fillable = [
'user_id', 'app_data'
];
protected $casts = [
'user_id' => 'int',
'app_data' => 'array'
];
public function getAppDataAttribute($value)
{
try {
return decrypt($value);
}
catch (DecryptException $e) {
return $value;
}
}
public function setAppDataAttribute($value)
{
$this->attributes['app_data'] = encrypt($value);
}
}
为什么我对阵列所做的添加未保存?
编辑:奇怪的局面还在继续
如果我打电话:
UserData :: where('id',$ userData-> id)-> update(['app_data'=> $ encryptedData]);
然后,模型会更新,并且不加密,但是,当我刷新并记录新的“ app_data”字段时,该模型将作为JSON字符串而不是以前的数组返回。每次我想使用它时,都需要将其转换/解码为数组。
答案 0 :(得分:0)
要寻找的事物。
1)Laravel加密器使用应用程序密钥。确保您的.env文件中有一个。如果没有,请运行php artisan key:generate
2)我假设数组的格式正确,如下所示:
Array
(
'token' => 'xyz', // You have a = here and no commas after any other value
'access_token' => 'abc'
)
3)根据要存储的内容,可以在加密阵列之前先对其进行序列化测试:
$arr = serialize($encryptedData); // After you have added new data to the array
$userData->app_data = $arr;
$userData->save();
这在Laravel中是自动的,但可能会帮助您解决该错误。使用encryptString()
和手动unserialize
/ decryptString()
使用增变器进行测试,通过逐步改变值来查看是否有任何奇怪的行为。