加密数组不会保存在雄辩模型中

时间:2019-10-07 22:27:23

标签: laravel eloquent

在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字符串而不是以前的数组返回。每次我想使用它时,都需要将其转换/解码为数组。

1 个答案:

答案 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()使用增变器进行测试,通过逐步改变值来查看是否有任何奇怪的行为。