Drupal 9 - Forward a request within Symfony

By kenneth, Fri, 04/01/2022 - 15:21

Prob. there are better ways or alternatives, but the next way works for me!

A route definition:

keboca.another_route:
  path: '/something/else'
  defaults:
    uri: '/valid_uri'
    _controller: '\Drupal\keboca\Controller\KController::forward'

The trick happens here:

<?php

namespace Drupal\keboca\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;

/**
 * Returns responses for KEBOCA routes.
 */
class KController extends ControllerBase {

  /**
   * Forwards the request to a valid URI.
   *
   * @param string $uri
   *
   * @return \Symfony\Component\HttpFoundation\Response
   * @throws \Exception
   */
  public function forward(string $uri) {
    // Init a sub request based on the current request.
    $request = \Drupal::request();
    $subRequest = Request::create($uri,
      $request->getMethod(),
      $request->query->all(),
      $request->cookies->all(),
      $request->files->all(),
      $request->server->all(),
      $request->getContent()
    );

    /** @var \Symfony\Component\HttpKernel\HttpKernelInterface $httpKernel */
    $httpKernel = \Drupal::service('http_kernel');
    return $httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
  }

}