You are here

class CustomErrorController in Customerror 8

Controller for errors pages.

Hierarchy

Expanded class hierarchy of CustomErrorController

File

src/Controller/CustomErrorController.php, line 15

Namespace

Drupal\customerror\Controller
View source
class CustomErrorController extends ControllerBase {

  /**
   * This is the method that will get called, with the services above already available.
   *
   * @param int $code
   *   The code of error.
   */
  public function index($code) {
    if (!is_numeric($code)) {
      throw new AccessDeniedHttpException();
    }
    $theme = customerror_get_theme($code);
    if (!empty($theme)) {
      global $custom_theme;
      $custom_theme = $theme;
    }
    switch ($code) {
      case 403:
        $internal_path = substr(\Drupal::request()
          ->getRequestUri(), strlen(base_path()));
        if ($internal_path) {
          $dest = parse_url($internal_path);
          if (isset($dest['query']['destination'])) {
            $_GET['destination'] = $dest['query']['destination'];
          }
          else {
            $_GET['destination'] = $internal_path;
          }
        }
        else {
          $_GET['destination'] = \Drupal::config('system.site')
            ->get('page.front');
        }
        $_SESSION['destination'] = $_GET['destination'];
      case 404:
      default:

        // Check if we should redirect.
        $destination = \Drupal::request()
          ->getRequestUri();
        $redirect_list = \Drupal::config('customerror.settings')
          ->get('redirect');
        $redirect_list = !empty($redirect_list) ? explode("\n", $redirect_list) : [];
        foreach ($redirect_list as $item) {
          list($src, $dst) = explode(' ', $item);
          if (isset($src) && isset($dst)) {
            $src = str_replace("/", "\\/", $src);
            $dst = str_replace("\r", "", $dst);

            // In case there are spaces in the URL, we escape them.
            $orig_dst = str_replace(" ", "%20", $destination);
            if (preg_match("/{$src}/", $orig_dst)) {

              // drupal_goto($dst);
              // return new RedirectResponse(url($dst, array('absolute' => TRUE)));
              $dst = $dst == '<front>' ? Url::fromRoute($dst)
                ->toString() : $dst;
              header('Location: ' . $dst, TRUE, 302);
              exit;
            }
          }
        }

        // Make sure that we sent an appropriate header.
        customerror_header($code);
        $content = \Drupal::config('customerror.settings')
          ->get("{$code}.body");
        break;
    }
    $login_form = '';

    // If the user is not logged in, show the login form.
    if (\Drupal::currentUser()
      ->isAnonymous()) {

      // For reasons that are not clear to me, setting the form state redirect
      // here has no effect, logging in at this form puts us on a custom error
      // path looking like this: /customerror/403?destination=/admin/config
      // And that destination isn't going to do anything for us at that point.
      // $path = $this->getRequest()->getPathInfo();
      // $url = \Drupal\Core\Url::fromUserInput($path);
      $form_state = new \Drupal\Core\Form\FormState();

      // $form_state->setRedirectUrl($url);
      // Instead of the above code, we have to do the same thing in ... ah,
      // that's the deal, we have to do it in the submit handler or else it's
      // overridden, OK this makes sense now.
      $login_form = \Drupal::formBuilder()
        ->getForm('Drupal\\user\\Form\\UserLoginForm', $form_state);
    }
    return [
      '#theme' => 'customerror__' . $code,
      '#description' => $content,
      '#login_form' => $login_form,
    ];
  }

  /**
   * Title callback.
   *
   * @param int $code
   *   The code of error.
   *
   * @return string
   *   The title to page.
   */
  public function titleCallback($code) {
    return \Drupal::config('customerror.settings')
      ->get("{$code}.title");
  }

  /**
   * Gets the request object.
   *
   * @return \Symfony\Component\HttpFoundation\Request
   *   The request object.
   */
  protected function getRequest() {
    if (!$this->requestStack) {
      $this->requestStack = \Drupal::service('request_stack');
    }
    return $this->requestStack
      ->getCurrentRequest();
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ControllerBase::$configFactory protected property The configuration factory.
ControllerBase::$currentUser protected property The current user service. 1
ControllerBase::$entityFormBuilder protected property The entity form builder.
ControllerBase::$entityManager protected property The entity manager.
ControllerBase::$entityTypeManager protected property The entity type manager.
ControllerBase::$formBuilder protected property The form builder. 2
ControllerBase::$keyValue protected property The key-value storage. 1
ControllerBase::$languageManager protected property The language manager. 1
ControllerBase::$moduleHandler protected property The module handler. 2
ControllerBase::$stateService protected property The state service.
ControllerBase::cache protected function Returns the requested cache bin.
ControllerBase::config protected function Retrieves a configuration object.
ControllerBase::container private function Returns the service container.
ControllerBase::create public static function Instantiates a new instance of this class. Overrides ContainerInjectionInterface::create 40
ControllerBase::currentUser protected function Returns the current user. 1
ControllerBase::entityFormBuilder protected function Retrieves the entity form builder.
ControllerBase::entityManager Deprecated protected function Retrieves the entity manager service.
ControllerBase::entityTypeManager protected function Retrieves the entity type manager.
ControllerBase::formBuilder protected function Returns the form builder service. 2
ControllerBase::keyValue protected function Returns a key/value storage collection. 1
ControllerBase::languageManager protected function Returns the language manager service. 1
ControllerBase::moduleHandler protected function Returns the module handler. 2
ControllerBase::redirect protected function Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait::redirect
ControllerBase::state protected function Returns the state storage service.
CustomErrorController::getRequest protected function Gets the request object.
CustomErrorController::index public function This is the method that will get called, with the services above already available.
CustomErrorController::titleCallback public function Title callback.
LinkGeneratorTrait::$linkGenerator protected property The link generator. 1
LinkGeneratorTrait::getLinkGenerator Deprecated protected function Returns the link generator.
LinkGeneratorTrait::l Deprecated protected function Renders a link to a route given a route name and its parameters.
LinkGeneratorTrait::setLinkGenerator Deprecated public function Sets the link generator service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
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.
UrlGeneratorTrait::$urlGenerator protected property The url generator.
UrlGeneratorTrait::getUrlGenerator Deprecated protected function Returns the URL generator service.
UrlGeneratorTrait::setUrlGenerator Deprecated public function Sets the URL generator service.
UrlGeneratorTrait::url Deprecated protected function Generates a URL or path for a specific route based on the given parameters.