@mstnorris It is 'ageless'.
There is always some 'lost soul' (like me) looking for answers :)
Another way (5.4 - did not earlier versions) is:
- service provider,
- boot() method and
- View::share, where 'value' holds e.g. array/collection with data to be looped in menu.
Idea is, that you probably want to share menu data across system and View::share allows just that.
Then what you need is some view blade with html @include(ed) wherever you need your menu.
https://laravel.com/docs/5.4/views#passing-data-to-views
EDIT:
Powering dynamic menu data via Provider is not a good idea, if you need access to Authorized User object.
Say, you want to limit access to menu parts based on user role, or something similar.
In above case, Provider is not your friend, as it comes to party before anybody else.
In other words, user is not authenticated yet, when your code is being run via Provider.
So, I guess View Composer in that case is not good as well.
I am not sure, maybe View Creators - see bottom of this page.
https://laravel.com/docs/5.4/views#view-composers
I haven't tried them.
But to the point.
After some trial'n'error I decided to go for Middleware, run by 'web' middleware group.
These guys seem to show up after authentication, so user object is available already.
Just, if you use repository, remember to inject it via constructor and then using protected method pass it to method handle.
Trying to let it resolve for you via Service Container (directly as 3rd argument in method handle) will not work.
I used View::share, but I think you can also use composers, as they are not attached by the hip to Provider, they just use it as launching point.
This is not mine, someone else coined this phrase:
"If it stupid, but it works, it ain't stupid."
Well, we'll see about that ;)