Селективное кэширование Laravel

Я разрабатываю одно из своих первых приложений с каркасом Laravel 4 (что, кстати, радует дизайн). Для одного компонента существует запрос AJAX для запроса внешнего сервера. Проблема в том, что я хочу кэшировать эти ответы в течение определенного периода времени, только если они успешны .

У Laravel есть функция Cache :: remember (), но проблема в том, что, похоже, нет «неудачного» режима (по крайней мере, ни один из них не описан в их документации), где кеш не будет храниться.

Например, возьмите эту упрощенную функцию:

try { $server->query(); } catch (Exception $e) { return Response::json('error', 400); } 

Я хотел бы использовать Cache :: запомнить на выходе этого, но только если не было исключено Exception. Я могу придумать несколько менее элегантных способов сделать это, но я бы подумал, что Laravel, будучи таким … красноречивым … фреймворком, будет лучше. Любая помощь? Благодаря!

Я нашел этот вопрос, потому что я искал ответ на эту тему.

Между тем я нашел решение и хотел бы поделиться им здесь:
(также проверьте пример 2 далее в коде)

 <?php /** * Caching the query - Example 1 */ function cacheQuery_v1($server) { // Set the time in minutes for the cache $minutes = 10; // Check if the query is cached if (Cache::has('db_query')) { return Cache::get('db_query'); } // Else run the query and cache the data or return the // error response if an exception was catched try { $query = $server->query(...); } catch (Exception $e) { return Response::json('error', 400); } // Cache the query output Cache::put('db_query', $query, $minutes); return $query; } /** * Caching the query - Example 2 */ function cacheQuery_v2($server) { // Set the time in minutes for the cache $minutes = 10; // Try to get the cached data. Else run the query and cache the output. $query = Cache::remember('db_query', $minutes, function() use ($server) { return $server->query(...); }); // Check if the $query is NULL or returned output if (empty($query)) { return Response::json('error', 400); } return $query; } 

Я рекомендую вам использовать Larvel's Eloquent ORM и / или Query Builder для работы с базой данных.

Счастливое кодирование!

Это то, что сработало для меня:

 if (Cache::has($key)) { $data = Cache::get($key); } else { try { $data = longQueryOrProcess($key); Cache::forever($key, $data); // only stored when no error } catch (Exception $e) { // deal with error, nothing cached } } 

И, конечно же, вы можете использовать Cache::put($key, $data, $minutes); вместо forever

Мы работаем над этим, сохраняя последнее хорошее значение в Cache::forever() . Если в обратном вызове обновления кеша есть ошибка, мы просто вытаскиваем последнее значение из вечного ключа. Если это будет успешным, мы обновим вечный ключ.