Зашифрованный массив не сохранится в красноречивой модели - PullRequest
0 голосов
/ 08 октября 2019

У меня странная ошибка при сохранении зашифрованного массива в 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();

Однако,Здесь начинается проблема. Модель не обновляется. Остается так, как будто ничего не происходит. Следовательно, если я обновляю (), я получаю те же данные, как если бы я никогда не добавлял две новые записи. Когда я его регистрирую, это выглядит так:

Array
(
[token] => xyz
[access_token] => abc 
)

После добавления двух новых записей:

Array
(
[token] => xyz
[access_token] => abc 
[new] => 'axy'
[time] => 1234
)

И после сохранения () и 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 голосов
/ 08 октября 2019

Несколько вещей, которые нужно искать.

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(), чтобы увидеть, не является ли какое-либо странное поведение, шагая по значениям по мере их изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...