Skip to main content

什麼是 Wayfinder

Laravel Wayfinder 是可將 Laravel 後端與 TypeScript 前端零阻力地連接的套件。它會自動從 controller 與路由產生完整型別化的 TypeScript 函式,因此可以從前端程式碼將 Laravel 的 endpoint 當作函式直接呼叫。 URL 硬編碼、路由參數的手動管理、後端變更的手動同步——這些全部都不再需要。
Wayfinder 為 Beta 版(目前 v0.1.x)。到 v1.0.0 釋出前 API 可能會變更。所有重要變更都會記錄在 CHANGELOG 中。

Ziggy 與 Wayfinder 的差異

什麼是 Ziggy

Ziggy 是長年廣泛用於 Laravel 生態系的路由 helper。它會將 Laravel 的路由定義公開到 JavaScript 端,可用 route('posts.show', { id: 1 }) 這樣的形式產生 URL。

為何被 Wayfinder 取代

Ziggy 以字串處理路由名稱與參數,因此在與 TypeScript 相容性上有其極限。路由名稱的拼寫錯誤或錯誤的參數名只會變成執行時錯誤。 Wayfinder 是 TypeScript 優先設計,會將 controller 方法產生為 可 import 的函式 在基於 Inertia 的 Laravel 入門套件(React、Vue、Svelte)中,Wayfinder 是標準採用。

安裝

1. 使用 Composer 安裝伺服器端套件

2. 使用 NPM 安裝 Vite plugin

3. 在 vite.config.js 中新增 plugin

加入 Vite plugin 後,在開發伺服器執行期間,每當 PHP 檔案或路由檔案變更,就會自動重新產生 TypeScript 檔案。

產生 TypeScript 定義檔

使用 wayfinder:generate 指令產生 TypeScript 檔案。
預設會在 resources/js 下產生 3 個目錄。
產生的檔案在每次 build 時都會完整重新產生,因此建議加入 .gitignore。請將 wayfinderactionsroutes 三個目錄一併排除。
若要變更輸出位置可使用 --path 選項。
也可只產生 controller action 或只產生路由。

基本用法

import 與使用 action

以下是產生對應 PostControllershow 方法的 URL 範例。
只需要 URL 時使用 .url()
也可以指定特定的 HTTP method。

傳遞參數的方式

Wayfinder 的函式可接受多種形式的參數。
若路由有指定 key binding(/posts/{post:slug}),可使用該值。

import 整個 controller

也可以 import 整個 controller 呼叫方法。
import 整個 controller 時 tree shaking 會失效,所有 action 都會包含在 bundle 中。個別 import 能讓最終 bundle 尺寸更小。

單一 action controller

單一 action controller(Invokable Controller)可以直接呼叫 import 的函式。

import 命名路由

要以路由名稱存取時,請使用 routes/ 下的檔案。

Query 參數

所有 Wayfinder 函式都可以用 query 選項加上 query 參數。
要與目前 URL 的 query 參數合併時使用 mergeQuery

Form 變體

要在傳統 HTML form 中使用時,加上 --with-form 選項產生,並使用 .form 變體。

Inertia 與 Wayfinder 的組合

結合 Inertia 的 form helper 與 Wayfinder,可以完全不寫 URL 字串即可送出表單。
Link 元件也可以同樣使用。

於入門套件中的採用

使用 laravel new 建立新專案並選擇 React、Vue、Svelte 時,會取得已自動設定 Wayfinder 的組合。入門套件包含:
  • Composer 套件 laravel/wayfinder
  • NPM 套件 @laravel/vite-plugin-wayfinder
  • vite.config.js 已設定 plugin
  • .gitignore 已加入產生目錄
既有專案的手動導入也可依上述步驟進行。

保留字與衝突方法名稱的處理

deleteimport 這類與 JavaScript 保留字同名的 controller 方法會加上 Method 後綴。

目前狀況(v0.1.x)

目前穩定版於 v0.1.x 分支提供。截至 2026 年 3 月,最新版本為 v0.1.15

v0.1.x 系列主要變更歷程


next 分支開發中的下一代功能

next 分支正在開發從目前 v0.1.x 大幅擴充功能的下一版本。
next 分支可以用 dev-next 限制安裝,但 API 可能有大幅變更。不建議在正式環境使用。

產生的 TypeScript 範圍大幅擴大

v0.1.x 只以路由與 controller action 為對象,下一版本則會將以下項目全部產生為 TypeScript。

Form Request 的 TypeScript 型別產生

上述 Form Request 會產生以下型別。

Eloquent Model 的型別產生

上述模型會在 types.d.ts 中產生型別。

PHP Enum 轉為 TypeScript

型別與常數會同時產生。

輸出目錄的變更

v0.1.x 分為 actions/routes/wayfinder/ 三個目錄,下一版本將統整到 resources/js/wayfinder 下。

從 v0.1.x 到 next 的主要變更

  • import 路徑從 @/actions/... 變更為 @/wayfinder/...
  • 廢除 --skip-actions--skip-routes--with-form flag,改為透過設定檔設定
  • types.ts 改為 types.d.ts

總結

Laravel Wayfinder 是將 Ziggy 提供的「從 JavaScript 參照 Laravel 路由」功能以 TypeScript 優先重新設計的套件。透過 import 產生函式後使用的方式,在型別安全、IDE 支援、tree shaking 三個面向都大幅改善。 目前的 v0.1.x 也能實現型別安全地參照路由與 controller action,並在基於 Inertia 的 Laravel 入門套件中作為標準採用。而正在 next 分支開發的下一版本,將進化為包含 Form Request、Eloquent Model、Enum、Inertia 頁面 prop 都以 TypeScript 產生的更全面型別安全基盤。

Laravel Wayfinder GitHub

原始碼、CHANGELOG、Issue 請見此處。

Vite Plugin Wayfinder

Vite plugin 設定選項的詳情請見此處。
最後修改於 2026年8月2日