The way I did:
In my controllers, sometimes I pass data, sometimes not:
$request->session()->flash('message_partial', 'messages.added');
$request->session()->flash('message_data', ['spelling' => $request->spelling]);
$request->session()->flash('message_partial', 'messages.added_demo');
In my main app layout, I make sure I cast the data to array, in case it's null:
@if (session('message_partial'))
@include(session('message_partial'), (array) session('message_data'))
@endif
I have a layout for the messages:
<div class="alert alert-flash fade in alert-@yield('type')" role="alert">
@yield('body')
</div>
And I extend the layout in all of my messages partials:
@extends('layouts.messages')
@section('type', 'info')
@section('body')
Words cannot be mastered in demo mode. Please <a href="{{ url('register') }}" class="alert-link">register</a> to start recording your own words!
@endsection
Works quite well, at least if you just have a few messages, that are quite similar. Might need to find another solutions if number of flash messages grow or are too different.