🛣️
[Laravel] route関数をフロントにも
第44回関西PHP勉強会(Laravel特集)の登壇資料を記事にしたものです。
Laravelで定義したルートをフロントで使う方法
Laravelのルート、フロントにどうやって渡してますか
こんなルートをサーバーサイドで定義していて

フロントでそこにPOSTしたいみたいなとき。

方法としては2つ
-
パスを直書き
- 変更に弱い
- タイポに気付くのが遅い
-
サーバーサイドからdata属性とかで渡す

- 使う分だけ記述量が増える
- datasetは型が不明
Ziggyを使うと
少ない記述で、変更に強くて、type-safeなURLを生成できる!

Ziggy
ziggyとは

Ziggyは、Laravelのように動作するJavaScriptのroute()関数を提供し、JavaScriptで名前付きLaravelルートを簡単に使えるようにします。
(DeepL訳)
あまり知られていない?
inertia.jsのドキュメントにチラッと出てくる
LaravelのStarter Kitに同梱されてるけどLaravel側のドキュメントにはほとんど説明が無い
使い方
インストール方法
- composer側にインストール
composer require tighten/ziggy
- ziggy-jsのエイリアス設定
// vite.config.js resolve.alias
'ziggy-js': path.resolve('vendor/tightenco/ziggy'),
- 型を生成
php artisan ziggy:generate --types-only
// resources/js/ziggy.d.ts
- global.d.tsにroute関数を追加

-
@routesディレクティブをbladeに追加
<head>
@routes
</head>
- tsで補完が効く🙌🏻

パラメータもタイポしてるとエラーで教えてくれる

型安全にする方法
-
strictRouteNames
さっきのglobal.d.ts

これをtrueにしておくことで、存在するroute nameしかroute関数の第一引数に渡せなくなる
-
vendor/tightenco/ziggy/src/js/index.d.ts

strictRouteNamesがデフォルトでfalseなので、stringも許容される。なぜかドキュメントに説明がない
-
Discussionに投げておいた
ディレクティブ使う時の注意
-
全部出力すると全ルートがバレるので絞って
@routesの中身
// config/ziggy.php return [ 'groups' => [ 'admin' => ['admin.*', 'users.*'], 'author' => ['posts.*'], ], ];{{-- admin.blade.php --}} @routes(['admin', 'author'])
Discussion