编程

Laravel 中的全局视图数据管理

55 2025-01-10 23:59:00

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 简化了让数据全局用于视图的过程,同时保持代码的组织性和可维护性。

 

下一篇