Laravel 8: 如何在不同的页面(使用相同的布局)和组件之间共享一个 PHP 变量?

Laravel 8: How to share a PHP variable with different pages (using same layout) and components?

我正在开发这个网络应用程序 (Laravel 8),用户可以在其中选择他们的颜色主题。基本上,为了简单起见,假设每个用户都可以选择他们的 primary_color.

在首页(不需要认证),primary_color 将来自配置(无论用户是否认证)。在经过身份验证的页面上,primary_color 来自用户 table(对于经过身份验证的用户)。如果用户未通过身份验证,我还有一堆页面使用访客布局,如果用户通过身份验证,则使用应用程序布局。如果用户未通过身份验证,它们将使用配置中的 primary_color,如果用户通过身份验证,则使用用户选择的 primary_color。

所有这些页面都使用了一些需要了解 primary_color 的组件(按钮、导航链接等)。

我目前在需要知道 primary_color:

的每个 php 文件的顶部都有这一行
$primary_color = (Auth::user() && Route::current()->getName() !== 'home') ? Auth::user()->config->color_theme : "yellow";

(颜色“黄色”在这里是硬编码的,忽略它。)

我很想避免那么多代码复制,但我似乎无法找到从布局(guest.blade.php 或 app.blade.php)到页面共享此变量的方法。我似乎也无法包含包含变量的 style.blade.php 视图。在此包含的视图中声明的变量在页面的其余部分不存在。我设法使用道具将变量传递给组件。它不是很好,但它工作正常。但这不是很好,我宁愿使用更清洁的解决方案。

但最重要的是,如何避免在每个页面顶部复制相同的代码?

谢谢!

如果您想与所有视图共享数据,您可以使用 laravel 的视图编辑器。 它可以同时将数据附加到所有视图或多个视图。 来源:https://laravel.com/docs/5.0/views#view-composers 或者:看这里 https://www.digitalocean.com/community/tutorials/sharing-data-between-views-using-laravel-view-composers

您可以使用视图编辑器。在 AppServiceProviderboot 方法下添加以下代码。

\Illuminate\Support\Facades\View::composer('*',function($view){
            $userPrimaryColor = (Auth::user() && ! Route::is('home')) ? Auth::user()->config->color_theme : "yellow";
            $view->with('primary_color', $userPrimaryColor);
        });

第一个参数*表示需要共享给所有视图。如果您需要几页中的那些,您可以将页面列表作为数组

传递