Je souhaite rediriger les utilisateurs avec RedirectResponse
et afficher un message, mais le message ne s'affiche pas.
$response = new RedirectResponse($url);
$response->send();
Après un petit débogage, j'ai constaté que mon URL (source) initiale était chargée deux fois et que les messages (ajoutés avec drupal_set_message()
) étaient supprimés de la session dans drupal_get_messages()
. Je n'ai donc aucun message sur ma cible $url
.
Comment puis-je atteindre cet objectif?
Je le fais dans hook_field_widget_form_alter()
.
Après quelques recherches, j'ai découvert que je devais interrompre le script juste après la réponse. Vous devez être très prudent avec cette approche, car elle peut casser certaines actions importantes.
$response = new RedirectResponse($url->toString());
$response->send();
exit;
Réglez le paramètre de répétition dans drupal_set_message()
sur VRAI et cela fonctionnera:
$response = new RedirectResponse($url);
$response->send();
drupal_set_message(t('My message after redirect'), 'status', TRUE);
J'ai eu ce même problème, mais utiliser une sortie pour terminer le script n'est pas une bonne idée. Drupal possède des fonctions d'arrêt qu'il exécute à la fin d'un chargement de page, ce qui peut être important. Au lieu de cela, je devais simplement renvoyer la réponse de redirection directement:
public function buildForm(array $form, FormStateInterface $form_state) {
$wizard_data = $form_state->getTemporaryValue('wizard');
if (empty($wizard_data['csv_data'])) {
drupal_set_message($this->t('Please upload a file first.'), 'error');
return $this->redirect('my.route')->send();
}
Redirection:
// Drupal\Core\Url; // Symfony\Component\HttpFoundation\RedirectResponse; $url = Url::fromUri('internal:/'); $response = new RedirectResponse($url->toString()); $response->send();
Messeges utilisant un service statique:
\Drupal::messenger()->addStatus($message);
Autres équivalents:
addMessage()
, addError()
, addWarning()
.
Références:
Je dirais que la solution n'est pas d'envoyer la réponse vous-même mais à votre retour.
return $response;
Fonctionne pour moi dans le rappel du contrôleur. Ne doit pas utiliser send (), mais simplement renvoyer l'objet RedirectResponce.
drupal_set_message(t('Please log in or create new account.'));
$url = Url::fromRoute('user.login');
$response = new RedirectResponse($url->toString());
return $response;
Recréez la fonctionnalité de déconnexion. Cela appelle simplement la fonction user_logout()
.
Pour cela, je crée:
ne méthode dans SomeController
public function logout() {
user_logout();
return $this->redirect('<front>', [], ['query' => ['logout' => 1]]);
}
n abonné à l'événement, abonnez-vous à KernelEvents::REQUEST
$queryLogout = \Drupal::request()->query->get('logout');
if (!empty($queryLogout) && $queryLogout == 1) {
drupal_set_message("You are logged out");
}
n abonné routeur, modifiant le contrôleur de la route user.logout
protected function alterRoutes(RouteCollection $collection) {
// Change controller who handle logout.
if ($routeLogout = $collection->get('user.logout')) {
$routeLogout->setDefault('_controller', '\Drupal\my_module\Controller\SomeController::logout');
}
}
N'utilisez pas la fonction send (), renvoyez simplement $ response et cela fonctionne.
$response = new RedirectResponse(\Drupal::url('user.login'));
// $response->send();
return $response;