Laravel 在所有视图中共享变量的服务提供商

Laravel service provider for sharing a variable in all views

我想在所有视图中共享一个变量,但我不确定这样做是否正确?我做了一个服务商:

<?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()
    {
        //
    }
}

但我的观点仍然有误。我是否需要注册我的服务提供商,或者它应该开箱即用?

首先,对于这么小的一段代码,我不担心创建一个全新的服务提供者。我只想将以上内容添加到您的 AppServiceProvider。此外,您还可以内联上述代码:

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

至于注册提供商。从字面上看,您所要做的就是转到 config/app.php,找到 providers 数组并将您的提供商添加到其中。 在您的罐头中,您可以添加:

App\Providers\ShareWorktypesInViewsProwider::class,

它的文档: https://laravel.com/docs/5.3/providers#registering-providers

希望对您有所帮助!

关于此的最新更新。虽然 @Rwd 解决方案效果很好,但您可能 运行 遇到困难,因为服务提供商对每个请求都是 运行。

因此,无论您是否在视图等,您最终都会从数据库中请求工作类型。

现在实现此目标的最佳方法是使用 Laravel View composers

通过将以下内容添加到您的服务提供商中,您将仅在需要时在视图中调用 Worktype::all()。

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

尽管确保使用一些缓存,否则每次查看都会调用它!