2015-04-21 5 views
4

У меня есть две функции, которые выглядят почти одинаково и называются справа один за другим как AJAX-запросы из функции JavaScript.Laravel Cache: недопустимые данные

/** 
    * get all Airports for autocomplete 
    */ 
    public function getAirports(){ 
     if(Cache::has('airports')){ 
      return Cache::get('airports'); 
     } 

     $airportModel = new Airport; 

     $airports = json_encode($airportModel -> _getForAutocomplete('iata_faa_code')); 

     Cache::put('airports', $airports, 600); 

     return $airports; 
    } 

    /** 
    * get all Countries for autocomplete 
    */ 
    public function getCountries(){ 
     if(Cache::has('countries')){ 
      return Cache::get('countries'); 
     } 

     $countryModel = new Country; 

     $countries = json_encode($countryModel -> _getForAutocomplete('two_letter_code')); 

     Cache::put('countries', $countries, 600); 

     return $countries; 
    } 

Теперь, когда я иду на страницу в первый раз, я получаю данные правильно (так как он не кэшируются пока). Если я перейду на страницу во второй раз, я получу страны, но для аэропортов я получаю следующую ошибку и не понимаю, почему.

{"error":{"type":"Illuminate\\Encryption\\DecryptException","message":"Invalid data.","file":"C:\\xampp\\htdocs\\laravel\\vendor\\laravel\\framework\\src\\Illuminate\\Encryption\\Encrypter.php","line":132}}

я обнаружил, что он должен сделать что-то с кешем погуглить и удаление Cache-часть. Я был бы очень рад, если бы кто-то мог помочь мне с этим.

Кстати, я использую базу данных в качестве моего драйвера кеша.

С наилучшими пожеланиями, Марсель

ответ

5

Я считаю, что есть что-то подозрительное уходящее с сериализацией. возможно, что во время сериализации аэропорты будут повреждены.

Если значение строки в аэропорту слишком велико для поля MySQL, то конец будет автоматически отключен и дешифрование данных не будет выполнено.

По умолчанию Laravel рекомендует использовать тип поля значения как текст. Чтобы сделать его больше, вы можете использовать поля mediumText или longText.

+0

Я не попадаю в блок if. Если я делаю 'dd (Cache :: get ('airport'))' или 'dd (Cache :: has ('airport'))' перед if-блоком, я получаю ту же ошибку – molerat

+0

В этом случае я рекомендую очистите кеш БД вручную и проверьте строку json, записанную в БД, и если она точно такая же и в БД. Может быть, что-то пошло не так в json_encode –

+0

Как я могу сравнить его со строкой в ​​БД? В БД предполагается шифрование – molerat

Смежные вопросы