Webページでは何らかのフォームで保存ボタンを押した後に次のページにリダイレクトすることがあり、
リダイレクトされた次のページでフィードバックしたいということがよくあります。
Laravelにおいてこのフィードバックを出す方法と、そのテスト方法について説明します。
バックエンドでセッションのフラッシュデータに値を入れる
Controller で以下のようにwithでフラッシュデータに値を入れておきます。
public function add() {
// 保存とか色々する
// 最後に次のページへリダイレクトさせる
return redirect()->route('/')->with('success', '保存が成功しました');
}
公式ドキュメントでいうと https://readouble.com/laravel/5.8/ja/responses.html
フラッシュデータを保存するリダイレクト
あたりの章です。
フィードバックの HTML と SCSS
Laravelのヘルパ関数でsession()というのがあるので、それで値をとります。
LaravelのBladeファイルで書くとHTMLは以下のようになります。
@if(session('success'))
<div class="feedback-wrapper">
<div class="feedback success">
{{ session('success') }}
</div>
</div>
@endif
対応するSCSS
.feedback-wrapper {
.feedback {
margin: auto;
padding: 12px;
border-radius: 4px;
text-align: center;
&.success {
border: 1px solid green;
color: green;
font-weight: bold
}
}
}
テスト方法
Featureテストを書く時に、フラッシュデータが何が入っているかというのをテストに書きます。
public function testAdd()
{
$this->post('/test/add', [
'text' => '入力したテキストです',
])->assertRedirect('/text')->assertSessionHas('success');
}
assertSessionHas() を使えば、仮にリダイレクト先が同じでも、入っているフラッシュデータが違う 'success' と 'warning' であっても区別することができます。