首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Laravel 視圖間共享資料與視圖 Composer 完整指南

     編輯:PHP 綜合知識

前言

Laravel 提供兩種機制在多個視圖間共享資料:全域共享 (view()->share()) 與 視圖 Composer (view()->composer())。前者適用於所有視圖都需要的靜態資料(如站點名稱),後者適用於需邏輯運算、依賴注入的動態資料(如登入使用者資訊、購物車數量)。本文詳細說明兩者用法與差異。

1. 視圖間共享資料 (view()->share())

在 Service Provider 的 boot() 方法中註冊

<?php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider {
    public function boot() {
        // 所有視圖皆可直接使用 $sitename 變數
        view()->share('sitename', 'Laravel 學院');
    }
    
    public function register() { /* ... */ }
}
?>

路由與視圖測試

// routes/web.php
Route::get('hello', function () { return view('hello'); });
Route::get('home',  function () { return view('home'); });
{{-- resources/views/hello.blade.php --}}
歡迎來到 {{ $sitename }}!
{{-- resources/views/home.blade.php --}}
{{ $sitename }} 首頁

訪問 /hello 與 /home 均正常輸出「Laravel 學院」。

2. 視圖 Composer (view()->composer())

基本用法:閉包函數

public function boot() {
    view()->share('sitename', 'Laravel 學院');
    
    // 僅 hello 視圖注入 $user 變數
    view()->composer('hello', function ($view) {
        $view->with('user', [
            'name'   => 'test',
            'avatar' => '/path/to/test.jpg'
        ]);
    });
}

修改 hello.blade.php

歡迎來到 {{ $sitename }}!

<h3>使用者資訊</h3>
使用者名:{{ $user['name'] }}<br>
使用者頭像:{{ $user['avatar'] }}

訪問 /hello 顯示使用者資訊;/home 不受影響。

多視圖綁定

// 陣列指定多個視圖
view()->composer(['hello', 'home'], function ($view) {
    $view->with('user', ['name' => 'test', 'avatar' => '/path/to/test.jpg']);
});

全域視圖綁定 (通配符)

// 所有視圖皆注入
view()->composer('*', function ($view) {
    $view->with('user', ['name' => 'test', 'avatar' => '/path/to/test.jpg']);
});

3. 進階:基於類別的 Composer (支援依賴注入)

建立 Composer 類別

<?php
namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Repositories\UserRepository;

class ProfileComposer {
    protected $users;
    
    public function __construct(UserRepository $users) {
        $this->users = $users;
    }
    
    public function compose(View $view) {
        $view->with('profile', $this->users->getAuthProfile());
    }
}

在 Service Provider 註冊

public function boot() {
    view()->composer('profile', 'App\Http\ViewComposers\ProfileComposer');
    // 或多視圖
    view()->composer(['profile', 'dashboard'], 'App\Http\ViewComposers\ProfileComposer');
}

4. 兩者差異對照

特性view()->share()view()->composer()
適用場景靜態、全域、不變資料動態、需邏輯運算、特定視圖
資料來源直接給值閉包/類別方法運算產生
依賴注入不支援支援 (類別式 Composer)
作用範圍所有視圖指定視圖/通配符
效能影響極小視邏輯複雜度而定

5. 實戰建議

  • 站點設定、CSRF Token、全域選單 → share()。
  • 登入使用者、購物車數量、未讀通知 → composer('*') 或針對布局視圖 composer('layouts.app')。
  • 特定頁面才需的資料 (如個人檔案頁的詳細資料) → composer('profile') 類別式,利用 DI 獲取 Repository。
  • 避免在 Composer 閉包中執行重資料庫查詢;若必要,請加入 快取 (Cache::remember())。

總結

view()->share() 適合「一次設定、到處可用」的靜態資料;view()->composer() 適合「按需運算、精準注入」的動態資料。善用兩者結合,可保持控制器精簡、視圖資料來源清晰、效能可控。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved