🛣️
[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