Laravel 中的全局视图数据管理
Laravel 的 View::share
方法提供了一个直接了当的方式,让数据在应用中跨越所有视图进行共享,适合于处理全局设置、用户偏好或者通用 UI 元素。
在 Laravel 应用中,你经常会碰到需要在所有(或大部分)视图中共享的数据,比如用户信息、应用设置、导航菜单或者 footer 内容。在每个控制器中都传递这些数据会导致代码重复。Laravel 的 View::share
方法允许你一次性定义数据,并使之在所有视图中都可获取。
该特性以在下方面特别有用:
- 全站设置 (应用名,联系信息)
- 用户特定的数据(通知、偏好)
- 通用 UI 元素(导航菜单,footer 链接)
- 系统状态信息 (维护模式、公告)
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
View::share('site_name', config('app.name'));
}
}
以下是使用全局应用配置和用户偏好的实例:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use App\Services\ThemeService;
use App\Services\MenuService;
class ViewServiceProvider extends ServiceProvider
{
public function boot(): void
{
// Skip for console commands
if (!app()->runningInConsole()) {
// Share application settings
View::share([
'app_version' => config('app.version'),
'contact_email' => config('app.contact_email'),
'social_links' => [
'twitter' => config('social.twitter'),
'github' => config('social.github'),
'linkedin' => config('social.linkedin')
]
]);
// Share authenticated user data
View::composer('*', function ($view) {
if ($user = auth()->user()) {
$view->with([
'user_theme' => app(ThemeService::class)->getUserTheme($user),
'sidebar_menu' => app(MenuService::class)->getMenuItems($user),
'notifications_count' => $user->unreadNotifications()->count()
]);
}
});
}
}
}
View::share
简化了让数据全局用于视图的过程,同时保持代码的组织性和可维护性。