class RecentlyReadService in Recently Read 8
Recently read service.
Hierarchy
- class \Drupal\recently_read\RecentlyReadService implements RecentlyReadServiceInterface
 
Expanded class hierarchy of RecentlyReadService
1 string reference to 'RecentlyReadService'
1 service uses RecentlyReadService
File
- src/
RecentlyReadService.php, line 14  
Namespace
Drupal\recently_readView source
class RecentlyReadService implements RecentlyReadServiceInterface {
  /**
   * The current user injected into the service.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $currentUser;
  /**
   * Entity type manager service.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;
  /**
   * SessionManager service.
   *
   * @var \Drupal\Core\Session\SessionManager
   */
  protected $sessionManager;
  /**
   * Config factory service.
   *
   * @var \Drupal\Core\Config\ConfigFactory
   */
  protected $configFactory;
  /**
   * The Recently Read storage.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $recentlyReadStorage;
  /**
   * Constructor.
   *
   * @param \Drupal\Core\Session\AccountInterface $current_user
   *   The current user.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity manager.
   * @param \Drupal\Core\Session\SessionManager $sessionManager
   *   Session manager.
   * @param \Drupal\Core\Config\ConfigFactory $configFactory
   *   Config factory service.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public function __construct(AccountInterface $current_user, EntityTypeManagerInterface $entity_type_manager, SessionManager $sessionManager, ConfigFactory $configFactory) {
    $this->currentUser = $current_user;
    $this->entityTypeManager = $entity_type_manager;
    $this->sessionManager = $sessionManager;
    $this->configFactory = $configFactory;
    $this->recentlyReadStorage = $this->entityTypeManager
      ->getStorage('recently_read');
  }
  /**
   * {@inheritdoc}
   */
  public function insertEntity(EntityInterface $entity, AccountInterface $user = NULL) {
    // Get configuration and check if RR delete options is count based.
    $config = $this->configFactory
      ->getEditable('recently_read.configuration');
    $maxRecords = NULL;
    if ($config
      ->get('delete_config') == "count") {
      $maxRecords = $config
        ->get('count');
    }
    // Assert a user.
    $user = $user ?? $this->currentUser;
    // If anonymous set user_id to 0 and check for any existing entries.
    if ($user
      ->isAnonymous()) {
      // Ensure something is in $_SESSION, otherwise the session ID will
      // not persist.
      // TODO: Replace this with something cleaner once core provides it.
      // See https://www.drupal.org/node/2865991.
      if (!isset($_SESSION['recently_read'])) {
        $_SESSION['recently_read'] = TRUE;
        $this->sessionManager
          ->start();
      }
      $exists = $this->recentlyReadStorage
        ->loadByProperties([
        'session_id' => $this->sessionManager
          ->getId(),
        'type' => $entity
          ->getEntityTypeId(),
        'entity_id' => $entity
          ->id(),
      ]);
    }
    else {
      $exists = $this->recentlyReadStorage
        ->loadByProperties([
        'user_id' => $user
          ->id(),
        'type' => $entity
          ->getEntityTypeId(),
        'entity_id' => $entity
          ->id(),
      ]);
    }
    // If exists then update created else create new.
    if (!empty($exists)) {
      foreach ($exists as $entry) {
        $entry
          ->setCreatedTime(time())
          ->save();
      }
    }
    else {
      // Create new.
      $recentlyRead = $this->recentlyReadStorage
        ->create([
        'type' => $entity
          ->getEntityTypeId(),
        'user_id' => $user
          ->id(),
        'entity_id' => $entity
          ->id(),
        'session_id' => $user
          ->id() ? 0 : $this->sessionManager
          ->getId(),
        'created' => time(),
      ]);
      $recentlyRead
        ->save();
    }
    // Delete records if there is a limit.
    $userRecords = $this
      ->getRecords($user
      ->id());
    if ($maxRecords && count($userRecords) > $maxRecords) {
      $records = array_slice($userRecords, $maxRecords, count($userRecords));
      $this
        ->deleteRecords($records);
    }
  }
  /**
   * {@inheritdoc}
   */
  public function deleteRecords(array $records) {
    foreach ($records as $rid) {
      // Delete data.
      $recently_read = $this->recentlyReadStorage
        ->load($rid);
      $recently_read
        ->delete();
    }
  }
  /**
   * {@inheritdoc}
   */
  public function getRecords($user_id) {
    if ($user_id != 0) {
      $records = $this->recentlyReadStorage
        ->getQuery()
        ->condition('user_id', $user_id)
        ->sort('created', 'DESC')
        ->execute();
    }
    else {
      $records = $this->recentlyReadStorage
        ->getQuery()
        ->condition('session_id', session_id())
        ->sort('created', 'DESC')
        ->execute();
    }
    return $records;
  }
  /**
   * {@inheritdoc}
   */
  public function deleteEntityRecords(EntityInterface $entity, AccountInterface $user = NULL) {
    $properties = [
      'type' => $entity
        ->getEntityTypeId(),
      'entity_id' => $entity
        ->id(),
    ];
    if ($user) {
      if ($user
        ->isAnonymous()) {
        $properties['session_id'] = $this->sessionManager
          ->getId();
      }
      else {
        $properties['user_id'] = $user
          ->id();
      }
    }
    $recently_read_entities = $this->recentlyReadStorage
      ->loadByProperties($properties);
    $this->recentlyReadStorage
      ->delete($recently_read_entities);
  }
}Members
| 
            Name | 
                  Modifiers | Type | Description | Overrides | 
|---|---|---|---|---|
| 
            RecentlyReadService:: | 
                  protected | property | Config factory service. | |
| 
            RecentlyReadService:: | 
                  protected | property | The current user injected into the service. | |
| 
            RecentlyReadService:: | 
                  protected | property | Entity type manager service. | |
| 
            RecentlyReadService:: | 
                  protected | property | The Recently Read storage. | |
| 
            RecentlyReadService:: | 
                  protected | property | SessionManager service. | |
| 
            RecentlyReadService:: | 
                  public | function | 
            Delete all "Recently Read" IDs for the entity. Overrides RecentlyReadServiceInterface:: | 
                  |
| 
            RecentlyReadService:: | 
                  public | function | 
            Delete records from DB. Overrides RecentlyReadServiceInterface:: | 
                  |
| 
            RecentlyReadService:: | 
                  public | function | 
            Get all records in DB for specified user/anonymous. Overrides RecentlyReadServiceInterface:: | 
                  |
| 
            RecentlyReadService:: | 
                  public | function | 
            Custom function to insert or update an entry for recently read. Overrides RecentlyReadServiceInterface:: | 
                  |
| 
            RecentlyReadService:: | 
                  public | function | Constructor. |