Laravel однократоно отображаемые сообщения (сообщения вспышки / flash message)

11.01.2020

Бывает нужно показать пользователю какое-либо сообщение только один раз.

Чаще всего это служебное сообщение: письмо отправлено, учетная запись активирована и подобные.

Выводиться они должны один раз и если пользователь обновит страницу или повторно на нее перейдет, то сообщения быть не должно.

pic1

Рассмотрим варианты 'Элемент добавлен' и 'Изменения сохранены' для постов блога на Laravel.

Сначала, в файл контроллера PostsController (/app/Http/Controllers/Admin/PostsController.php), нужно добавить:

 
use Illuminate\Support\Facades\Session;

Далее в методах store и update добавляем, соответственно:

 
Session::flash('flash_message', 'Элемент добавлен');

 
Session::flash('flash_message', 'Изменения сохранены');

В результате получится:

 
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Session;
use App\Post;

class PostsController extends Controller
{
    ...

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     * @throws \Illuminate\Validation\ValidationException
     */
    public function store(Request $request)
    {
        $this->validate($request, [
            'title' =>'required',
            'text'   =>  'required',
        ]);

        $post = Post::add($request->all());

        Session::flash('flash_message', 'Элемент добавлен');

        return redirect()->route('posts.index');
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  int $id
     * @return \Illuminate\Http\Response
     * @throws \Illuminate\Validation\ValidationException
     */
    public function update(Request $request, $id)
    {
        $post = Post::find($id);
        $this->validate($request, [
            'title' =>'required',
            'text'   =>  'required',
        ]);

        $post->update($request->all());

        Session::flash('flash_message', 'Изменения сохранены');

        return redirect()->route('posts.index');
    }

    ...
}

Далее нужно подготовить представление для вывода сообщений, например, так (файл /resources/views/messages.blade.php ):

 
@if (Session::has('flash_message'))
    <div class="container">
        <div class="row">
            <div class="col-md-10">
                <div class="alert alert-success">
                    {{Session::get('flash_message')}}
                </div>
            </div>
        </div>
    </div>
@endif

И вывести его у нужном месте шаблона (@include('messages')). Для примера в файле /resources/views/admin/posts/index.blade.php:

 
@include('errors')
@include('messages')


Категории: Laravel
Пометки: Laravel flash_message on Save/Update added (сообщение вспышка)
Яндекс.Метрика