RedirectResponse
でユーザーをリダイレクトしてメッセージを表示したいのですが、メッセージが表示されません。
_$response = new RedirectResponse($url);
$response->send();
_
少しデバッグしたところ、最初の(ソース)URLが2回読み込まれ、メッセージ(drupal_set_message()
で追加されたもの)がdrupal_get_messages()
のセッションから削除されました。したがって、ターゲット_$url
_にメッセージがありません。
どうすればこれを達成できますか?
hook_field_widget_form_alter()
で実行しています。
調査の結果、応答の直後にスクリプトを中断する必要があることがわかりました。このアプローチはいくつかの重要なアクションを壊す可能性があるため、このアプローチには十分注意する必要があります。
$response = new RedirectResponse($url->toString());
$response->send();
exit;
drupal_set_message()
のrepeatパラメータをTRUEに設定すると、機能します。
$response = new RedirectResponse($url);
$response->send();
drupal_set_message(t('My message after redirect'), 'status', TRUE);
これと同じ問題がありましたが、スクリプトを終了するために出口を使用することは良い考えではありません。 Drupalには、ページの読み込みの最後に実行されるシャットダウン機能があり、重要な場合があります。代わりに、リダイレクト応答を直接返す必要がありました。
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();
}
リダイレクト:
// Drupal\Core\Url; // Symfony\Component\HttpFoundation\RedirectResponse; $url = Url::fromUri('internal:/'); $response = new RedirectResponse($url->toString()); $response->send();
静的サービスを使用したメッセージ:
\Drupal::messenger()->addStatus($message);
その他の同等物:
addMessage()
、addError()
、addWarning()
。
参照:
解決策は、自分で応答を送信するのではなく、自分の代わりに送信することです。
return $response;
コントローラのコールバック内で私のために働きます。 send()を使用するべきではなく、RedirectResponceオブジェクトを返すだけです。
drupal_set_message(t('Please log in or create new account.'));
$url = Url::fromRoute('user.login');
$response = new RedirectResponse($url->toString());
return $response;
ログアウト機能を再作成します。それは単にuser_logout()
関数を呼び出しているだけです。
このために、私は作成します:
SomeController
のメソッド
public function logout() {
user_logout();
return $this->redirect('<front>', [], ['query' => ['logout' => 1]]);
}
イベント購読者、KernelEvents::REQUEST
にサブスクライブ
$queryLogout = \Drupal::request()->query->get('logout');
if (!empty($queryLogout) && $queryLogout == 1) {
drupal_set_message("You are logged out");
}
ルーターサブスクライブ、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');
}
}
Send()関数を使用しないでください。$ responseを返すだけで機能します。
$response = new RedirectResponse(\Drupal::url('user.login'));
// $response->send();
return $response;