Help us understand the problem. What is going on with this article?

Laravel5.7: 1回限りのメッセージを表示する

More than 1 year has passed since last update.

「記事を更新しました。」「ログインしました。」などの1回限りのメッセージを表示します。

001.png

親記事

Laravel 5.7で基本的なCRUDを作る - Qiita

メッセージを表示する場所

:link: readouble.com: フラッシュデータを保存するリダイレクト

フラッシュメッセージを表示する場所をレイアウト内に設けます。
一時的な保存に使うセッション名はmy_statusで統一します。

resources/views/layouts/my.blade.php
         </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メソッドで簡単にビューへメッセージを渡すことができます。

app/Http/Controllers/PostController.php
     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.'));
app/Http/Controllers/UserController.php
     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.'));
     }

認証関連のメッセージ

デフォルトの認証では、パスワード再設定でのメール送信完了と、メール確認での再送信完了については、すでにフラッシュメッセージが用意されています。
しかし、ログイン、ログアウト、ユーザー登録、メール確認の完了については用意されていないので自作する必要があります。
また、パスワード再設定の完了は少し修正が必要です。
:link: Laracastsの質問: Laravel 5.2 Auth Flash Message

ログイン

下記のトレイトのauthenticatedメソッドをLoginControllerで上書きします。
:link: Illuminate\Foundation\Auth\AuthenticatesUsers

app/Http/Controllers/Auth/LoginController.php
// 忘れずにインポートすること!!
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メソッドを定義するようです。

PowerShell
> php artisan route:list

下記のトレイトのlogoutメソッドをLoginControllerで上書きします。
:link: Illuminate\Foundation\Auth\AuthenticatesUsers

app/Http/Controllers/Auth/LoginController.php
    /**
     * ユーザーをログアウトさせる
     *
     * @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で上書きします。
:link: Illuminate\Foundation\Auth\RegistersUsers

app/Http/Controllers/Auth/RegisterController.php
// 忘れずにインポートすること!!
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で上書きします。
:link: Illuminate\Foundation\Auth\VerifiesEmails

app/Http/Controllers/Auth/VerificationController.php
// 忘れずにインポートすること
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で上書きします。
:link: Illuminate\Foundation\Auth\ResetsPasswords

app/Http/Controllers/Auth/ResetPasswordController.php
// 忘れずにインポートすること
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));
    }
sutara79
宮崎 雄策。1979年生まれ。PHP(Laravel)、 JavaScript(jQuery)、英語を勉強中の文系Webプログラマ。
https://ja.gravatar.com/sutara79
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away