FormModeAccessCheck.php

Same filename in other branches
  1. 9 core/modules/field_ui/src/Access/FormModeAccessCheck.php
  2. 8.9.x core/modules/field_ui/src/Access/FormModeAccessCheck.php
  3. 11.x core/modules/field_ui/src/Access/FormModeAccessCheck.php

Namespace

Drupal\field_ui\Access

File

core/modules/field_ui/src/Access/FormModeAccessCheck.php

View source
<?php

namespace Drupal\field_ui\Access;

use Drupal\Core\Access\AccessResult;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\Routing\Route;

/**
 * Defines an access check for entity form mode routes.
 *
 * @see \Drupal\Core\Entity\Entity\EntityFormMode
 */
class FormModeAccessCheck implements AccessInterface {
    
    /**
     * The entity type manager.
     *
     * @var \Drupal\Core\Entity\EntityTypeManagerInterface
     */
    protected $entityTypeManager;
    
    /**
     * Creates a new FormModeAccessCheck.
     *
     * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
     *   The entity type manager.
     */
    public function __construct(EntityTypeManagerInterface $entity_type_manager) {
        $this->entityTypeManager = $entity_type_manager;
    }
    
    /**
     * Checks access to the form mode.
     *
     * @param \Symfony\Component\Routing\Route $route
     *   The route to check against.
     * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
     *   The parametrized route.
     * @param \Drupal\Core\Session\AccountInterface $account
     *   The currently logged in account.
     * @param string $form_mode_name
     *   (optional) The form mode. Defaults to 'default'.
     * @param string $bundle
     *   (optional) The bundle. Different entity types can have different names
     *   for their bundle key, so if not specified on the route via a {bundle}
     *   parameter, the access checker determines the appropriate key name, and
     *   gets the value from the corresponding request attribute. For example,
     *   for nodes, the bundle key is "node_type", so the value would be
     *   available via the {node_type} parameter rather than a {bundle}
     *   parameter.
     *
     * @return \Drupal\Core\Access\AccessResultInterface
     *   The access result.
     */
    public function access(Route $route, RouteMatchInterface $route_match, AccountInterface $account, $form_mode_name = 'default', $bundle = NULL) {
        $access = AccessResult::neutral();
        if ($entity_type_id = $route->getDefault('entity_type_id')) {
            if (empty($bundle)) {
                $entity_type = $this->entityTypeManager
                    ->getDefinition($entity_type_id);
                $bundle = $route_match->getRawParameter($entity_type->getBundleEntityType());
            }
            $visibility = FALSE;
            if ($form_mode_name == 'default') {
                $visibility = TRUE;
            }
            elseif ($entity_display = $this->entityTypeManager
                ->getStorage('entity_form_display')
                ->load($entity_type_id . '.' . $bundle . '.' . $form_mode_name)) {
                $visibility = $entity_display->status();
            }
            if ($form_mode_name != 'default' && $entity_display) {
                $access->addCacheableDependency($entity_display);
            }
            if ($visibility) {
                $permission = $route->getRequirement('_field_ui_form_mode_access');
                $access = $access->orIf(AccessResult::allowedIfHasPermission($account, $permission));
            }
        }
        return $access;
    }

}

Classes

Title Deprecated Summary
FormModeAccessCheck Defines an access check for entity form mode routes.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.