Ziggy
Use your Laravel routes in JavaScript.
Install / Use
/learn @tighten/ZiggyREADME

Ziggy – Use your Laravel routes in JavaScript
Ziggy provides a JavaScript route() function that works like Laravel's, making it a breeze to use your named Laravel routes in JavaScript.
Installation
Install Ziggy in your Laravel app with Composer:
composer require tightenco/ziggy
Add the @routes Blade directive to your main layout (before your application's JavaScript), and the route() helper function will be available globally!
By default, the output of the
@routesBlade directive includes a list of all your application's routes and their parameters. This route list is included in the HTML of the page and can be viewed by end users. To configure which routes are included in this list, or to show and hide different routes on different pages, see Filtering Routes.
Usage
route() function
Ziggy's route() function works like Laravel's route() helper—you can pass it the name of a route, and the parameters you want to pass to the route, and it will generate a URL.
Basic usage
Route::get('posts', fn (Request $request) => /* ... */)->name('posts.index');
route('posts.index'); // 'https://ziggy.test/posts'
Parameters
Route::get('posts/{post}', fn (Post $post) => /* ... */)->name('posts.show');
route('posts.show', 1); // 'https://ziggy.test/posts/1'
route('posts.show', [1]); // 'https://ziggy.test/posts/1'
route('posts.show', { post: 1 }); // 'https://ziggy.test/posts/1'
Multiple parameters
Route::get('venues/{venue}/events/{event}', fn (Venue $venue, Event $event) => /* ... */)
->name('venues.events.show');
route('venues.events.show', [1, 2]); // 'https://ziggy.test/venues/1/events/2'
route('venues.events.show', { venue: 1, event: 2 }); // 'https://ziggy.test/venues/1/events/2'
Query parameters
Ziggy adds arguments that don't match any named route parameters as query parameters:
Route::get('venues/{venue}/events/{event}', fn (Venue $venue, Event $event) => /* ... */)
->name('venues.events.show');
route('venues.events.show', {
venue: 1,
event: 2,
page: 5,
count: 10,
});
// 'https://ziggy.test/venues/1/events/2?page=5&count=10'
If you need to pass a query parameter with the same name as a route parameter, nest it under the special _query key:
route('venues.events.show', {
venue: 1,
event: 2,
_query: {
event: 3,
page: 5,
},
});
// 'https://ziggy.test/venues/1/events/2?event=3&page=5'
Like Laravel, Ziggy automatically encodes boolean query parameters as integers in the query string:
route('venues.events.show', {
venue: 1,
event: 2,
_query: {
draft: false,
overdue: true,
},
});
// 'https://ziggy.test/venues/1/events/2?draft=0&overdue=1'
Default parameter values
Ziggy supports default route parameter values (Laravel docs).
Route::get('{locale}/posts/{post}', fn (Post $post) => /* ... */)->name('posts.show');
// app/Http/Middleware/SetLocale.php
URL::defaults(['locale' => $request->user()->locale ?? 'de']);
route('posts.show', 1); // 'https://ziggy.test/de/posts/1'
Examples
HTTP request with axios:
const post = { id: 1, title: 'Ziggy Stardust' };
return axios.get(route('posts.show', post)).then((response) => response.data);
Router class
Calling Ziggy's route() function with no arguments will return an instance of its JavaScript Router class, which has some other useful properties and methods.
Check the current route: route().current()
// Laravel route called 'events.index' with URI '/events'
// Current window URL is https://ziggy.test/events
route().current(); // 'events.index'
route().current('events.index'); // true
route().current('events.*'); // true
route().current('events.show'); // false
route().current() optionally accepts parameters as its second argument, and will check that their values also match in the current URL:
// Laravel route called 'venues.events.show' with URI '/venues/{venue}/events/{event}'
// Current window URL is https://myapp.com/venues/1/events/2?hosts=all
route().current('venues.events.show', { venue: 1 }); // true
route().current('venues.events.show', { venue: 1, event: 2 }); // true
route().current('venues.events.show', { hosts: 'all' }); // true
route().current('venues.events.show', { venue: 6 }); // false
Check if a route exists: route().has()
// Laravel app has only one named route, 'home'
route().has('home'); // true
route().has('orders'); // false
Retrieve the current route params: route().params
// Laravel route called 'venues.events.show' with URI '/venues/{venue}/events/{event}'
// Current window URL is https://myapp.com/venues/1/events/2?hosts=all
route().params; // { venue: '1', event: '2', hosts: 'all' }
Note: parameter values retrieved with
route().paramswill always be returned as strings.
Route-model binding
Ziggy supports Laravel's route-model binding, and can even recognize custom route key names. If you pass route() a JavaScript object as a route parameter, Ziggy will use the registered route-model binding keys for that route to find the correct parameter value inside the object. If no route-model binding keys are explicitly registered for a parameter, Ziggy will use the object's id key.
// app/Models/Post.php
class Post extends Model
{
public function getRouteKeyName()
{
return 'slug';
}
}
Route::get('blog/{post}', function (Post $post) {
return view('posts.show', ['post' => $post]);
})->name('posts.show');
const post = {
id: 3,
title: 'Introducing Ziggy v1',
slug: 'introducing-ziggy-v1',
date: '2020-10-23T20:59:24.359278Z',
};
// Ziggy knows that this route uses the 'slug' route-model binding key:
route('posts.show', post); // 'https://ziggy.test/blog/introducing-ziggy-v1'
Ziggy also supports custom keys for scoped bindings declared directly in a route definition:
Route::get('authors/{author}/photos/{photo:uuid}', fn (Author $author, Photo $photo) => /* ... */)
->name('authors.photos.show');
const photo = {
uuid: '714b19e8-ac5e-4dab-99ba-34dc6fdd24a5',
filename: 'sunset.jpg',
}
route('authors.photos.show', [{ id: 1, name: 'Ansel' }, photo]);
// 'https://ziggy.test/authors/1/photos/714b19e8-ac5e-4dab-99ba-34dc6fdd24a5'
TypeScript
Ziggy includes TypeScript type definitions, and an Artisan command that can generate additional type definitions to enable route name and parameter autocompletion.
To generate route types, run the ziggy:generate command with the --types or --types-only option:
php artisan ziggy:generate --types
To make your IDE aware that Ziggy's route() helper is available globally, and to type it correctly, add a declaration like this in a .d.ts file somewhere in your project:
import { route as routeFn } from 'ziggy-js';
declare global {
var route: typeof routeFn;
}
If you don't have Ziggy's NPM package installed, add the following to your jsconfig.json or tsconfig.json to load Ziggy's types from your vendor directory:
{
"compilerOptions": {
"paths": {
"ziggy-js": ["./vendor/tightenco/ziggy"]
}
}
}
Strict route name type checking
By default, even when you generate type definitions to enable better autocompletion, Ziggy still allows passing any string to route(). You can optionally enable strict type checking of route names, so that calling route() with a route name Ziggy doensn't recognizes triggers a type error. To do so, extend Ziggy's TypeConfig interface and set strictRouteNames to true:
declare module 'ziggy-js' {
interface TypeConfig {
strictRouteNames: true
}
}
Place this declaration in a .d.ts type definition file somewhere in your project. Depending on your setup, you may need to add
Related Skills
node-connect
351.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
351.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
351.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
