Redirect wenn kein Zugriff (oder auch sonst)
am 01.11.2021 - 13:52 Uhr in
Hallo zusammen,
ich suche noch nach einer geeigneten Methode, wie ich einen Redirect geschickt einbauen kann.
Ich rufe ein URL auf, die einen Parameter enthält, z.B. /home am Ende.
nun möchte ich, wenn diese Seite einen Access-Denied liefert, am Ende das /home durch ein about ersetzen.
Sowas in der Art. Ich schätze mal, ich würde dazu eine eigene Funktion benötigen. Sowas gibt es bestimmt nicht als Modul. Vielleicht kann man das über deine page-preprocess-Funktion regeln.
Ich habe es hier mal als Frage reingestellt, denn ich könnte mir vorstellen, dass interessiert viele und vielleicht gibt es ja eine bessere Lösung als die preprocess-Funktion. Mal schauen, was ihr so in Petto habt.
Gruß Berthold aus Aachen
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich würde es auch über eine
am 04.11.2021 - 08:17 Uhr
Ich würde es auch über eine Funktion regeln.
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de
Also mein Tipp wäre, das über
am 04.11.2021 - 15:18 Uhr
Also mein Tipp wäre, das über einen eigenen EvenSubscriber zu machen. Ich nehme an, mit "/home durch /about ersetzen" meinst Du eigentlich "weiterleiten zu"?
Du könntest z.B. in einer service.yml einen Service definieren, der die Klasse CustomPageExceptionHtmlSubscriber extended.
Ich habe das folgender Maßen gemacht. Auf unserer Plattform haben Politiker ein Profil mit mehreren Unterseiten. Diese Profil-Unterseiten werden über "access denied" ausgeblendet, z.B. wenn es für einen Politiker keine Infos über Nebeneinkünfte gibt. Ruft der Politiker nun die Nebeneinkünfte-Unterseite seines Profils auf (was aus diversen Gründen passieren kann), soll er aber keine Access denied Meldung sehen, sollen zur Hauptseite des Profils weitergeleitet werden. So viel nur zum Hintergrund.
In MODULE.services.yml:
MODULE.exception.politician_profile_subpage:
class: Drupal\MODULE\EventSubscriber\PoliticianProfileAccessDeniedSubscriber
tags:
- { name: event_subscriber }
arguments: ['@config.factory', '@http_kernel', '@logger.channel.php', '@redirect.destination', '@router.no_access_checks', '@access_manager', '@current_route_match']
Die Klasse dazu:
namespace Drupal\MODULE\EventSubscriber;
use Drupal\MODULE\PoliticianSubpageManager;
use Drupal\Core\Access\AccessManagerInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\EventSubscriber\CustomPageExceptionHtmlSubscriber;
use Drupal\Core\Routing\CurrentRouteMatch;
use Drupal\Core\Routing\RedirectDestinationInterface;
use Drupal\Core\Url;
use Drupal\MODULE\Entity\Politician;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
/**
* Exception subscriber for handling 403 access denied error on politician
* profile subpages in order to redirect to the main profile page
*/
class PoliticianProfileAccessDeniedSubscriber extends CustomPageExceptionHtmlSubscriber {
/**
* @var \Drupal\Core\Routing\CurrentRouteMatch
*/
protected $currentRouteMatch;
public function __construct(ConfigFactoryInterface $config_factory, HttpKernelInterface $http_kernel, LoggerInterface $logger, RedirectDestinationInterface $redirect_destination, UrlMatcherInterface $access_unaware_router, AccessManagerInterface $access_manager, CurrentRouteMatch $currentRouteMatch) {
parent::__construct($config_factory, $http_kernel, $logger, $redirect_destination, $access_unaware_router, $access_manager);
$this->currentRouteMatch = $currentRouteMatch;
}
/**
* Handles a 403 error for HTML.
*
* @param \Symfony\Component\HttpKernel\Event\ExceptionEvent $event
* The event to process.
*/
public function on403(ExceptionEvent $event) {
if (PoliticianSubpageManager::isProfileSubpage($this->currentRouteMatch->getRouteName())) {
$politician = $this->getPolitician();
if ($politician) {
$redirectResponse = new RedirectResponse(Url::fromRoute('entity.politician.canonical', ['politician' => $politician->id()])->toString());
$event->setResponse($redirectResponse);
}
}
else {
parent::on403($event);
}
}
/**
* @return \Drupal\MODULE\Entity\Politician|null
*/
protected function getPolitician(): ?Politician {
$politician = $this->currentRouteMatch->getParameter('politician');
if ($politician instanceof Politician) {
return $politician;
}
elseif (is_numeric($politician)) {
return Politician::load($politician);
}
return NULL;
}
/**
* {@inheritdoc}
*/
protected static function getPriority() {
return 100;
}
}
Für Dich wichtig ist die on403() Methode... hier müsstest Du nur prüfen, welche Route gerade aufgerufen wurde (bei Dir wohl die Route für /home) und dann zur Route für /about weiterleiten.
Das ist sehr interessant. Ich
am 04.11.2021 - 19:16 Uhr
Das ist sehr interessant.
Ich werde mir das mal ganz genau anschauen.
In der Tat meinte ich mit /home / about ersetzen, weiterleiten, also ein Ersetzen in der URL :-)
(ungeschickte Ausdrucksweise von mir)
Ich habe es jetzt erst mal über die preprocess_page Funktion geregelt.
Dazu habe ich die $_SERVER["REQUEST_URI"] ausgewertet und entsprechend meinen Bedürfnissen mit einem header-Befehl auf die "richtige" Seite weitergeleitet.
Was ist der Vorteil von Deiner Methode, die zweifelsohne sehr viel aufwendiger scheint ?
Gruß Berthold aus Aachen
Drupal Video-Tutorials