「記事を更新しました。」「ログインしました。」などの1回限りのメッセージを表示します。
親記事
Laravel 5.7で基本的なCRUDを作る - Qiita
メッセージを表示する場所
readouble.com: フラッシュデータを保存するリダイレクト
フラッシュメッセージを表示する場所をレイアウト内に設けます。
一時的な保存に使うセッション名はmy_status
で統一します。
</nav>
+ {{-- フラッシュ・メッセージ --}}
+ @if (session('my_status'))
+ <div class="container mt-2">
+ <div class="alert alert-success">
+ {{ session('my_status') }}
+ </div>
+ </div>
+ @endif
+
<main class="py-4">
@yield('content')
</main>
postsとusers関連のメッセージ
with
メソッドで簡単にビューへメッセージを渡すことができます。
public function store(StorePost $request)
{
- return redirect('posts/' . $post->id);
+ return redirect('posts/' . $post->id)->with('my_status', __('Posted new article.'));
(中略)
public function update(StorePost $request, Post $post)
{
- return redirect('posts/'.$post->id);
+ return redirect('posts/' . $post->id)->with('my_status', __('Updated an article.'));
(中略)
public function destroy(Post $post)
{
- return redirect('posts');
+ return redirect('posts')->with('my_status', __('Deleted an article.'));
public function store(StoreUser $request)
{
- return redirect('users/' . $user->id);
+ return redirect('users/' . $user->id)->with('my_status', __('Created new user.'));
(中略)
public function update(Request $request, User $user)
{
- return redirect('users/' . $user->id);
+ return redirect('users/' . $user->id)->with('my_status', __('Updated a user.'));
(中略)
public function destroy(User $user)
{
- return redirect('users');
+ return redirect('users')->with('my_status', __('Deleted a user.'));
}
認証関連のメッセージ
デフォルトの認証では、パスワード再設定でのメール送信完了と、メール確認での再送信完了については、すでにフラッシュメッセージが用意されています。
しかし、ログイン、ログアウト、ユーザー登録、メール確認の完了については用意されていないので自作する必要があります。
また、パスワード再設定の完了は少し修正が必要です。
Laracastsの質問: Laravel 5.2 Auth Flash Message
ログイン
下記のトレイトのauthenticated
メソッドをLoginControllerで上書きします。
Illuminate\Foundation\Auth\AuthenticatesUsers
// 忘れずにインポートすること!!
use Illuminate\Http\Request;
(中略)
/**
* ログイン後の処理
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return \Illuminate\Http\Response
*/
protected function authenticated(Request $request, $user)
{
// ログインしたら、ユーザー自身のプロフィールページへ移動
return redirect('users/' . $user->id)->with('my_status', __('You logged in.'));
}
ログアウト
まず、Laravel5.7でのログアウトのルートを確認します。
下記のコマンドで、App\Http\Controllers\Auth\LoginController@logout
だと分かりました。
ログインと同じく、Loginコントローラにlogout
メソッドを定義するようです。
> php artisan route:list
下記のトレイトのlogout
メソッドをLoginControllerで上書きします。
Illuminate\Foundation\Auth\AuthenticatesUsers
/**
* ユーザーをログアウトさせる
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
// ログアウトしたら、トップページへ移動
return $this->loggedOut($request) ?: redirect('/')->with('my_status', __('You logged out.'));
}
ユーザー登録
下記のトレイトのregistered
メソッドをRegisterControllerで上書きします。
Illuminate\Foundation\Auth\RegistersUsers
// 忘れずにインポートすること!!
use Illuminate\Http\Request;
(中略)
/**
* ユーザー登録後の処理
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return \Illuminate\Http\Response
*/
protected function registered(Request $request, $user)
{
// 登録したら、そのユーザーのプロフィール・ページへ移動
return redirect('users/' . $user->id)->with('my_status',
__('Registration have not yet completed.') .
__('Check your email for a verification link.')
);
}
メール確認の完了
下記のトレイトのverify
メソッドをVerificationControllerで上書きします。
Illuminate\Foundation\Auth\VerifiesEmails
// 忘れずにインポートすること
use Illuminate\Auth\Events\Verified;
(中略)
/**
* ユーザーのメールアドレスを確認完了とする
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function verify(Request $request)
{
if ($request->route('id') == $request->user()->getKey() &&
$request->user()->markEmailAsVerified()) {
event(new Verified($request->user()));
}
return redirect($this->redirectPath())->with('my_status', __('Registration completed.'));
}
パスワード再設定の完了
再設定用のメール送信の完了と同じく、再設定の手続きすべてが完了してリダイレクトする際にも、フラッシュメッセージを表示するようにあらかじめ設定されています。
しかしそのセッション名がstatus
なので、これをmy_status
に変更しなければなりません。
下記のトレイトのsendResetResponse
メソッドをResetPasswordControllerで上書きします。
Illuminate\Foundation\Auth\ResetsPasswords
// 忘れずにインポートすること
use Illuminate\Http\Request;
(中略)
/**
* パスワード再設定が完了した場合の処理
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetResponse(Request $request, $response)
{
// リダイレクト先でフラッシュメッセージを表示する
return redirect($this->redirectPath())
->with('my_status', trans($response));
}