You are here

class RegistrationAccessControlHandler in RNG - Events and Registrations 3.x

Same name and namespace in other branches
  1. 8.2 src/AccessControl/RegistrationAccessControlHandler.php \Drupal\rng\AccessControl\RegistrationAccessControlHandler
  2. 8 src/AccessControl/RegistrationAccessControlHandler.php \Drupal\rng\AccessControl\RegistrationAccessControlHandler

Access controller for the registration entity.

Hierarchy

Expanded class hierarchy of RegistrationAccessControlHandler

File

src/AccessControl/RegistrationAccessControlHandler.php, line 21

Namespace

Drupal\rng\AccessControl
View source
class RegistrationAccessControlHandler extends EntityAccessControlHandler {
  use RuleGrantsOperationTrait;

  /**
   * The RNG event manager.
   *
   * @var \Drupal\rng\EventManagerInterface
   */
  protected $eventManager;

  /**
   * The event dispatcher.
   *
   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
   */
  protected $eventDispatcher;

  /**
   * {@inheritdoc}
   */
  public function __construct(EntityTypeInterface $entity_type) {
    parent::__construct($entity_type);
    $this->eventManager = \Drupal::service('rng.event_manager');
    $this->eventDispatcher = \Drupal::service('event_dispatcher');
  }

  /**
   * {@inheritdoc}
   *
   * @param \Drupal\rng\Entity\RegistrationInterface $entity
   *   A registration entity.
   */
  protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
    $account = $this
      ->prepareUser($account);
    if (in_array($operation, [
      'view',
      'update',
      'delete',
    ])) {
      if ($account
        ->hasPermission('administer rng')) {
        return AccessResult::allowed()
          ->cachePerPermissions();
      }
      $event = $entity
        ->getEvent();

      // Event access rules.
      $user = User::load($account
        ->id());
      $context_values = [
        'event' => $event,
        'registration' => $entity,
        'user' => $user,
      ];
      $rules = $this->eventManager
        ->getMeta($event)
        ->getRules('rng_event.register', TRUE);
      foreach ($rules as $rule) {
        if ($this
          ->ruleGrantsOperation($rule, $operation) && $rule
          ->evaluateConditions($context_values)) {
          return AccessResult::allowed()
            ->cachePerUser();
        }
      }
    }
    return AccessResult::neutral();
  }

  /**
   * {@inheritdoc}
   */
  public function createAccess($entity_bundle = NULL, AccountInterface $account = NULL, array $context = [], $return_as_object = FALSE) {

    // $entity_bundle: A registration type, or NULL if it is a registration type
    // listing.
    if (!isset($context['event'])) {
      throw new AccessException('Requires event context.');
    }
    $event = $context['event'];
    $fail = $return_as_object ? AccessResult::forbidden()
      ->addCacheableDependency($event)
      ->addCacheContexts([
      'rng_event',
      'user',
    ]) : FALSE;
    $account = $this
      ->prepareUser($account);
    try {
      $event = new RegistrationAccessEvent($entity_bundle, $account, $context);
      $this->eventDispatcher
        ->dispatch(RegistrationEvents::REGISTRATION_CREATE_ACCESS, $event);
      if (!$event
        ->isAccessAllowed()) {
        return $fail;
      }
      $event_meta = $this->eventManager
        ->getMeta($context['event']);

      // $entity_bundle is omitted for registration type list at
      // $event_path/register
      if ($entity_bundle && ($registration_type = RegistrationType::load($entity_bundle))) {
        if (!$event_meta
          ->registrationTypeIsValid($registration_type)) {
          return $fail;
        }
      }
      elseif (!$event_meta
        ->getRegistrationTypeIds()) {
        return $fail;
      }
      if (!$event_meta
        ->isAcceptingRegistrations()) {
        return $fail;
      }
      if ($event_meta
        ->remainingRegistrantCapacity() == 0) {
        return $fail;
      }
      if (!$event_meta
        ->canRegisterProxyIdentities()) {
        return $fail;
      }
      $result = parent::createAccess($entity_bundle, $account, $context, TRUE);
      if ($result
        ->isForbidden()) {
        return $return_as_object ? $result : $result
          ->isAllowed();
      }
      return $return_as_object ? AccessResult::allowed()
        ->addCacheableDependency($event)
        ->addCacheContexts([
        'rng_event',
        'user',
      ]) : TRUE;
    } catch (InvalidEventException $e) {
      return $fail;
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function 2
DependencySerializationTrait::__wakeup public function 2
EntityAccessControlHandler::$accessCache protected property Stores calculated access check results.
EntityAccessControlHandler::$entityType protected property Information about the entity type.
EntityAccessControlHandler::$entityTypeId protected property The entity type ID of the access control handler instance.
EntityAccessControlHandler::$viewLabelOperation protected property Allows to grant access to just the labels. 5
EntityAccessControlHandler::access public function Checks access to an operation on a given entity or entity translation. Overrides EntityAccessControlHandlerInterface::access 1
EntityAccessControlHandler::checkCreateAccess protected function Performs create access checks. 14
EntityAccessControlHandler::checkFieldAccess protected function Default field access as determined by this access control handler. 4
EntityAccessControlHandler::fieldAccess public function Checks access to an operation on a given entity field. Overrides EntityAccessControlHandlerInterface::fieldAccess
EntityAccessControlHandler::getCache protected function Tries to retrieve a previously cached access value from the static cache.
EntityAccessControlHandler::prepareUser protected function Loads the current account object, if it does not exist yet.
EntityAccessControlHandler::processAccessHookResults protected function We grant access to the entity if both of these conditions are met:
EntityAccessControlHandler::resetCache public function Clears all cached access checks. Overrides EntityAccessControlHandlerInterface::resetCache
EntityAccessControlHandler::setCache protected function Statically caches whether the given user has access.
EntityHandlerBase::$moduleHandler protected property The module handler to invoke hooks on. 5
EntityHandlerBase::moduleHandler protected function Gets the module handler. 5
EntityHandlerBase::setModuleHandler public function Sets the module handler for this handler.
RegistrationAccessControlHandler::$eventDispatcher protected property The event dispatcher.
RegistrationAccessControlHandler::$eventManager protected property The RNG event manager.
RegistrationAccessControlHandler::checkAccess protected function Overrides EntityAccessControlHandler::checkAccess
RegistrationAccessControlHandler::createAccess public function Checks access to create an entity. Overrides EntityAccessControlHandler::createAccess
RegistrationAccessControlHandler::__construct public function Constructs an access control handler instance. Overrides EntityAccessControlHandler::__construct
RuleGrantsOperationTrait::ruleGrantsOperation protected function Checks if any operation actions on a rule grant $operation access.
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.