PHP项目Laravel响应视图与视图合成

wen PHP项目 4

本文目录导读:

PHP项目Laravel响应视图与视图合成

  1. 响应视图 (Response Views)
  2. 视图合成器 (View Composers)
  3. 视图合成器的高级用法
  4. 实际应用示例
  5. 最佳实践
  6. 视图响应与合成器的区别

在 Laravel 中,响应视图视图合成器是两个不同的概念,让我详细解释一下:

响应视图 (Response Views)

基本用法

// 控制器中返回视图
namespace App\Http\Controllers;
use Illuminate\View\View;
class UserController extends Controller
{
    public function show(string $id): View
    {
        return view('users.show', ['user' => User::findOrFail($id)]);
    }
}

创建视图响应

// 返回视图并添加响应头
return response()
    ->view('welcome', ['name' => 'John'])
    ->header('Content-Type', 'text/plain')
    ->header('X-Custom-Header', 'Custom Value');

视图辅助函数

// 基本视图返回
return view('dashboard', $data);
// 带额外参数的视图
return view('reports.index', [ => '月报',
    'data' => $reportData
])->with('footer', 'Copyright 2024');

视图合成器 (View Composers)

视图合成器是在执行视图渲染前调用的回调逻辑,用于向视图注入共享数据。

定义视图合成器

// App\Providers\ViewServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use App\Http\Views\Composers\UserComposer;
class ViewServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        //
    }
    public function boot(): void
    {
        // 使用类方式
        View::composer('profile', UserComposer::class);
        // 使用闭包方式
        View::composer('dashboard', function ($view) {
            $view->with('stats', Dashboard::getStatistics());
        });
    }
}

创建合成器类

// app/Http/Views/Composers/UserComposer.php
namespace App\Http\Views\Composers;
use Illuminate\View\View;
use App\Services\UserService;
class UserComposer
{
    protected $userService;
    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }
    public function compose(View $view)
    {
        $view->with('user', $this->userService->getCurrentUser());
    }
}

视图合成器的高级用法

绑定到多个视图

// 多个特定视图
View::composer(['dashboard', 'reports'], DashboardComposer::class);
// 所有视图(使用通配符)
View::composer('*', GlobalComposer::class);
// 以 views 数组开头
View::composer('views.*', ViewsComposer::class);

视图创建器 (View Creators)

// 视图创建器在视图实例化时立即执行
View::creator('profile', ProfileCreator::class);
class ProfileCreator
{
    public function create($view)
    {
        $view->with('birthday', User::find(1)->birthday);
    }
}

使用类属性绑定数据

class SettingsComposer
{
    public $settings;
    public function __construct()
    {
        $this->settings = cache('application_settings');
    }
    public function compose(View $view)
    {
        $view->with('settings', $this->settings);
    }
}

实际应用示例

共享导航数据

// 服务提供者中注册
View::composer('layouts.navigation', function ($view) {
    $categories = Category::with('children')
        ->whereNull('parent_id')
        ->active()
        ->get();
    $view->with('categories', $categories);
});

购物车数据

class CartComposer
{
    public function compose(View $view)
    {
        $cart = Cart::session(auth()->id())->getContent();
        $view->with([
            'cartItems' => $cart,
            'cartTotal' => $cart->sum(fn($item) => $item->price * $item->quantity),
            'cartCount' => $cart->count()
        ]);
    }
}
// 注册
View::composer(['partials.cart', 'layouts.header'], CartComposer::class);

视图间的数据共享

// 多个视图共享数据
public function boot(): void
{
    View::composer(['layouts.sidebar', 'admin.dashboard'], function ($view) {
        $view->with('recentActivities', Activity::latest()->take(5)->get());
    });
}

最佳实践

缓存视图合成器(生产环境)

// config/view.php
'compiled' => env(
    'VIEW_COMPILED_PATH',
    realpath(storage_path('framework/views'))
),

性能考虑

// 只在需要的视图上使用合成器
View::composer('admin.reports', ReportComposer::class);
// 避免在全局使用过多合成器
// 考虑使用缓存
View::composer('*', function ($view) {
    $view->with('siteSettings', Cache::remember('site_settings', 3600, function () {
        return Settings::pluck('value', 'key');
    }));
});

视图响应与合成器的区别

特性 视图响应 视图合成器
目的 返回视图给浏览器 向视图注入共享数据
时机 控制器返回时 视图渲染前
绑定 单次请求 可全局绑定
数据 每个处理器单独传递 跨控制器共享

使用视图合成器可以避免在多个控制器中重复传递相同的数据,提高代码复用性和维护性。

抱歉,评论功能暂时关闭!