Laravel service provider for sharing a variable in all views

I want to share a variable in all views but i'm not sure if this is the right way to do it? I have made a service provider:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Worktype;

class ShareWorktypesInViewsProwider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {

        $worktypes = Worktype::all();
        view()->share('worktypes', $worktypes);


    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

but i still get an error in my view. Do i need to register my service provider or it should work out of the box?


Firstly, for such a small piece of code I wouldn't worry about creating a brand new service provider. I would just add the above to your AppServiceProvider. Also, you code inline the above as well:

view()->share('worktypes', Worktype::all());

As for registering a provider. Literally all you have to do is go to config/app.php, find the providers array and add your provider to it. In your can you would add:

App\Providers\ShareWorktypesInViewsProwider::class,

The documentation for it: https://laravel.com/docs/5.3/providers#registering-providers

Hope this helps!


A more recent update on this. While @Rwd solution works great, you may run into difficulties as the service provider is run every single request.

As a result, you'll end up requesting Worktype from the database regardless of whether you're on a view, etc.

The best way to achieve this now is by using Laravel View composers.

By adding the below into your service provider, you'll only call the Worktype::all() when needed within a view.

view()->composer('*', function($view) {
    $view->with(['worktypes' => Worktype::all()]);
});

Although make sure to use some caching otherwise it'll get called for every view!