質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

807閲覧

新しいルートルールを追加してリダイレクトさせた先へフラッシュメッセージを表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2020/04/08 01:15

編集2020/04/08 01:19

実現したいこと

以下のようにして、URLを整形し直したのですが、その新ルートルール が適応になって表示された先の画面で今まで出ていたFlashメッセージを表示させたいです

###前提(現在の実装)
https://ドメイン/コントローラー/メソッド/クラブID
というURLがあり、一部のクラブIDが乱数のようになっていたのでルートファイルに以下のような設定を追加しました
config/routes.php

$routes->connect('/clubs/confirm/cooking', ['controller' => 'Clubs', 'action' => 'confirm', 'fhdjsgs37msf71dj3jsfs']); このほか多数のURLの書き換え

その後リダイレクト処理を
src/Controller/AppController.php
へ記載しました

public function beforeFilter(\Cake\Event\Event $event) { ・ ・ //URLを変更したサロンはリダイレクトさせます $now_url = Router::url(); $patterns = [ "/", "/auth/login_for_pay/",     など、routeファイルに新しく書き足したルール先のリダイレクトリンク ]; $club_id_dict = [ "fhdjsgs37msf71dj3jsfs" => "cooking", など ]; foreach ($patterns as $pattern) { foreach ($club_id_dict as $key => $value){ $checURL = $pattern . $key; $quoteURL = preg_quote($checURL, '/'); $machULR = '/^' . $quoteURL . '/*/'; if(preg_match($machULR, $now_url)){ $new_url = preg_replace('/' . $key . '/', $value, $now_url); $this->redirect($new_url, 301); } } }

発生している問題・エラーメッセージ

悪質ユーザーのログインを拒否した場合、ログインができないというメッセージと共にクラブの詳細画面に遷移します。
もともと認証コントローラーで出力していたそのフラッシュメッセージをどのように引き継げばいいのかわからずにいます

該当のソースコード

// save if ($this->Users->save($user)) { if ($user->banned === '1') { $this->Flash->error('ログインに失敗しました。'); $session = $this->request->getSession(); $clubId = $session->read('currentClub'); return $this->redirect('/clubs/view/'. $clubId); }

試したこと

色々とだめであるとは思いつつも、リダイレクトさせる前にsessionに取得したメッセージを保存して
src/Controller/AppController.php

if(preg_match($machULR, $now_url)){ $new_url = preg_replace('/' . $key . '/', $value, $now_url); //リダイレクト先にフラッシュメッセージの情報を引き継ぎます $session = $this->request->getSession(); $errorMessage = $session->read(); if(!empty($errorMessage)){ if($errorMessage['Flash']['flash'][0]['element'] === 'Flash/error'){ $message = $errorMessage['Flash']['flash'][0]['message']; $this->Flash->set($message); } } $this->redirect($new_url, 301); }

対象のViewファイルで以下のように呼び出してみましたが、変わりませんでした

<?= $this->Flash->render() ?>

各クラブのViewファイルはクラブIDがディレクトリ名になっています
ルートルールを書き換えた場合、もともと表示されていたような形でフラッシュメッセージを出すことはできるでしょうか?

2つのクラブに対して9項目のリダイレクト設定をかけているので、それぞれのフラッシュを出しているコントローラーでの操作ではなく、AppCOntrollerで一括でフラッシュメッセージを渡す方法を探しています

もし何かいい方法がありましたらご教授いただきたいです
よろしくお願いいたします

補足情報(FW/ツールのバージョンなど)

cakephp3

参考
本家サイトのフラッシュメッセージの項目

cakeの2系でフラッシュメッセージをリダイレクト先で表示しようとしていたかたの記事

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

旧URL->viewファイル->新URL->Viewファイルというデータの流れ方をしていました

一度Viewファイルにデータが到達するためフラッシュのセッション情報が消えていたようです。リダイレクト前にフラッシュメッセージ のデータがあればwriteでセッションに保存し、afterfilterでビューが描画された後、フラッシュ表示&直後にセッション削除を行うことで通常の画面と同じフラッシュの出し方ができました

投稿2020/04/10 06:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問