. /** * Contains class caching_content_item_repository, for fetching content_items, with additional caching. * * @package core * @subpackage course * @copyright 2020 Jake Dallimore * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace core_course\local\repository; defined('MOODLE_INTERNAL') || die(); /** * The class caching_content_item_repository, for fetching content_items, with additional caching. * * This class decorates the content_item_repository and uses the supplied cache to store content items for user and course * combinations. The content items for subsequent calls are returned from the cache if present, else are retrieved from the wrapped * content_item_repository. * * @copyright 2020 Jake Dallimore * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class caching_content_item_readonly_repository implements content_item_readonly_repository_interface { /** @var \cache $cachestore the cache to use. */ private $cachestore; /** @var content_item_readonly_repository $contentitemrepository a content item repository. */ private $contentitemrepository; /** * The caching_content_item_readonly_repository constructor. * * @param \cache $cachestore a cache to use. * @param content_item_readonly_repository $contentitemrepository the repository to use as a fallback, after a cache miss. */ public function __construct(\cache $cachestore, content_item_readonly_repository $contentitemrepository) { $this->cachestore = $cachestore; $this->contentitemrepository = $contentitemrepository; } /** * Find all the content items for a given course and user. * * @param \stdClass $course The course to find content items for. * @param \stdClass $user the user to pass to plugins. * @return array the array of content items. */ public function find_all_for_course(\stdClass $course, \stdClass $user): array { global $USER; // Try to find this data in the cache first. $key = $USER->id . '_' . $course->id; $contentitems = $this->cachestore->get($key); if ($contentitems !== false) { return $contentitems; } // If we can't find it there, we must get it from the slow data store, updating the cache in the process. $contentitems = $this->contentitemrepository->find_all_for_course($course, $user); $this->cachestore->set($key, $contentitems); return $contentitems; } /** * Find all the content items made available by core and plugins. * * @return array */ public function find_all(): array { return $this->contentitemrepository->find_all(); } }