Giter Site home page Giter Site logo

ziggy's Introduction

Ziggy - Use your Laravel Named Routes inside JavaScript

Ziggy - Use your Laravel Named Routes inside JavaScript

TravisCi Status for tightenco/ziggy

Ziggy creates a Blade directive which you can include in your views. This will export a JavaScript object of your application's named routes, keyed by their names (aliases), as well as a global route() helper function which you can use to access your routes in your JavaScript.

Installation

  1. Add Ziggy to your Composer file: composer require tightenco/ziggy

  2. (if Laravel 5.4) Add Tightenco\Ziggy\ZiggyServiceProvider::class to the providers array in your config/app.php.

  3. Include our Blade Directive (@routes) somewhere in your template before your main application JavaScript is loaded—likely in the header somewhere.

Usage

This package replaces the @routes directive with a collection of all of your application's routes, keyed by their names. This collection is available at Ziggy.namedRoutes.

The package also creates an optional route() JavaScript helper which functions like Laravel's route() PHP helper, which can be used to retrieve URLs by name and (optionally) parameters.

Examples:

Without parameters:

route('posts.index') // Returns '/posts'

With required parameter:

route('posts.show', {id: 1}) // Returns '/posts/1'
route('posts.show', [1]) // Returns '/posts/1'
route('posts.show', 1) // Returns '/posts/1'

With multiple required parameters:

route('events.venues.show', {event: 1, venue: 2}) // Returns '/events/1/venues/2'
route('events.venues.show', [1, 2]) // Returns '/events/1/venues/2'

With query parameters:

route('events.venues.show', {event: 1, venue: 2, page: 5, count: 10}) // Returns '/events/1/venues/2?page=5&count=10'

If whole objects are passed, Ziggy will automatically look for id primary key:

var event = {id: 1, name: 'World Series'};
var venue = {id: 2, name: 'Rogers Centre'};

route('events.venues.show', [event, venue]) // Returns '/events/1/venues/2'

Practical AJAX example:

var post = {id: 1, title: 'Ziggy Stardust'};

return axios.get(route('posts.show', post))
    .then((response) => {
        return response.data;
    });

Default Values

See Laravel documentation

Default values work out of the box for Laravel versions >= 5.5.29, for the previous versions you will need to set the default parameters by including this code somewhere in the same page as our Blade Directive (@routes)

Ziggy.defautParameters = {
    //example
    locale: "en"
}

Filtering Routes

Filtering routes is completely optional. If you want to pass all of your routes to JavaScript by default, you can carry on using Ziggy as described above.

Basic Whitelisting & Blacklisting

To take advantage of basic whitelisting or blacklisting of routes, you will first need to create a standard config file called ziggy.php in the config/ directory of your Laravel app and set either the whitelist or blacklist setting to an array of route names.

Note: You've got to choose one or the other. Setting whitelist and blacklist will disable filtering altogether and simply return the default list of routes.

Example config/ziggy.php:

<?php
return [
    // 'whitelist' => ['home', 'api.*'],
    'blacklist' => ['admin.*', 'vulnerabilities.*'],
];

As shown in the example above, Ziggy the use of asterisks as wildcards in filters. home will only match the route named home whereas api.* will match any route whose name begins with api., such as api.posts.index and api.users.show.

Simple Whitelisting & Blacklisting Macros

Whitelisting and blacklisting can also be achieved using the following macros.

Example Whitelisting

Route::whitelist(function () {
    Route::get('...')->name('posts');
});

Route::whitelist()->get('...')->name('posts');

Example Blacklisting

Route::blacklist(function () {
    Route::get('...')->name('posts');
});

Route::blacklist()->get('...')->name('posts');

Advanced Whitelisting Using Groups

You may also optionally define multiple whitelists by defining groups in your config/ziggy.php:

<?php
return [
    'groups' => [
        'admin' => [
            'admin.*',
            'posts.*',
        ],
        'author' => [
            'posts.*',
        ]
    ],
];

In the above example, you can see we have configured multiple whitelists for different user roles. You may expose a specific whitelist group by passing the group key into @routes within your blade view. Example:

@routes('author')

Note: Using a group will always take precedence over the above mentioned whitelist and blacklist settings.

Other useful methods

current()

To get the name of the current route (based on the browser's window.location) you can use:

route().current()
// returns "home"

To check that we are at a current route, pass the desired route in the only param:

route().current("home")
// returns true

url()

Ziggy returns a wrapper of the string primitive, which behaves exactly like a string in almost all cases. In rare cases where third-party libraries use strict type checking, you may require an actual String literal.

To achieve this simple call .url() on your route:

route('home').url()
// http://myapp.local/

Artisan command

Ziggy publishes an artisan command to generate a ziggy.js routes file, which can be used as part of an asset pipeline such as Laravel Mix.

You can run php artisan ziggy:generate in your project to generate a static routes file in resources/assets/js/ziggy.js.

Optionally, include a second parameter to override the path and file names (you must pass a file name with the path):

php artisan ziggy:generate "resources/foo.js"

Example ziggy.js, where the named routes home and login exist in routes/web.php:

// routes/web.php

<?php

Route::get('/', function () {
    return view('welcome');
})->name('home');

Route::get('/login', function () {
    return view('login');
})->name('login');
// ziggy.js

var Ziggy = {
    namedRoutes: {"home":{"uri":"\/","methods":["GET","HEAD"],"domain":null},"login":{"uri":"login","methods":["GET","HEAD"],"domain":null}},
    baseUrl: 'http://myapp.local/',
    baseProtocol: 'http',
    baseDomain: 'myapp.local',
    basePort: false
};

export {
    Ziggy
}

Environment-based loading of minified route helper file

When loading the blade helper file, Ziggy will detect the current environment and minify the output if APP_ENV is not local.

When this happens, ziggy.min.js will be loaded. Otherwise, ziggy.js will be used.

Optional route helper

If you only want routes available through @routes, but don't need the route helper function, you can include skip-route-function in your config and set it to true:

// config/ziggy.php

<?php

return [
    'skip-route-function' => true
];

Using with Vue components

If you want to use the route helper within a Vue component, you'll need to add this to your app.js file:

Vue.mixin({
    methods: {
        route: route
    }
});

Then, use the method in your Vue components like so:

<a class="nav-link" :href="route('home')">Home</a>

Thanks to Archer70 for this solution.

Contributions & Credits

To get started contributing to Ziggy, check out the contribution guide.

Thanks to Caleb Porzio, Adam Wathan, and Jeffrey Way for help solidifying the idea.

ziggy's People

Contributors

danielcoulbourne avatar mattstauffer avatar ankurk91 avatar svenluijten avatar jakebathman avatar romeromsk avatar omranic avatar benabbottnz avatar quickliketurtle avatar jaybizzle avatar m1guelpf avatar ctf0 avatar raphaelsaunier avatar shpontex avatar darron1217 avatar

Watchers

Matthew Hailwood avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.