Laravel 视图创建器 - 预处理数据功能

Laravel locking

Laravel的视图创建器(View Creators)使你能够在视图实例化后立即准备数据,比视图合成器(View Composers)更早,这使得它们非常适合设置关键的视图数据或优化性能。

use Illuminate\Support\Facades\View;
// 注册视图创建器
View::creator('dashboard', DashboardCreator::class);

让我们通过一个管理动态应用程序菜单的实际示例来深入了解:

<?php

namespace App\View\Creators;

use App\Services\MenuService;
use Illuminate\View\View;
use Illuminate\Support\Facades\Auth;

class ApplicationMenuCreator
{
    protected $menuService;

    public function __construct(MenuService $menuService)
    {
        $this->menuService = $menuService;
    }

    public function create(View $view)
    {
        $user = Auth::user();

        $view->with([
           'mainMenu' => $this->menuService->getMainMenu($user),
            'quickActions' => $this->menuService->getQuickActions($user),
           'recentItems' => $this->menuService->getRecentItems($user),
            'notifications' => $this->menuService->getPendingNotifications($user)
        ]);
    }
}

// 在你的AppServiceProvider中
public function boot()
{
    View::creator('layouts.app', ApplicationMenuCreator::class);
}

// 在layouts/app.blade.php中的使用
<div class="sidebar">
    <nav>
        @foreach($mainMenu as $menuItem)
            <a href="{{ $menuItem['url'] }}" class="{{ $menuItem['active']? 'active' : '' }}">
                {{ $menuItem['label'] }}
            </a>
        @endforeach
    </nav>

    @if(count($quickActions))
        <div class="quick-actions">
            @foreach($quickActions as $action)
                <button onclick="handleAction('{{ $action['id'] }}')">
                    {{ $action['label'] }}
                </button>
            @endforeach
        </div>
    @endif
</div>

视图创建器为你的视图提供早期数据准备,确保在视图实例化后关键数据即可使用。

Publish on 2025-01-08,Update on 2025-02-10