Home  >  Article  >  PHP Framework  >  Teach you how to implement Laravel’s route function in JS

Teach you how to implement Laravel’s route function in JS

藏色散人
藏色散人forward
2020-05-24 14:17:506832browse

The following tutorial column is developed by Laravel to introduce you to the cool operations in Laravel ORM that you don’t know. I hope it will be helpful to friends who need it!

Teach you how to implement Laravel’s route function in JS

In Laravel's routing module, we can set a name for each route, such as:

Route::get('/blog/{blog}', 'BlogController@show')->name('blog.show');

Then we can pass route('blog .show', ['blog' => 1]) to get the access address of this route. The backend jump can be done with

return redirect()->route('blog.show', ['blog' => 1]);

. The advantage of this is that if the url changes, for example, I want to To change /blog/{blog} to /boke/{blog}, you only need to change the routing file, and no other adjustments are needed. Therefore, it is recommended to give each route a name and obtain it through the route name.

But this is only available for the backend and blade templates. Websites with a slightly larger scale will separate the js files and will not write the js directly in the blade template, which will cause ajax to be sent in the js. You can only hard-code the request address when making a request or page jump, such as

location.href = '/blog/' + id;

. In this case, if the route changes, you have to modify the js file. If the same route is called by multiple js, it is easy to miss Change a few things.

So I thought about whether I could implement a backend-like route function in js.

The final solution is very simple, just two functions can do it.

The back-end part needs to implement a function:

function route_uri($name)
{
    return app('router')->getRoutes()->getByName($name)->getUri();
}

The function of this function is to return the original routing address based on the routing name, for example:

echo route_uri('blog.show'); 
// 会输出/blog/{blog}

The front-end also only needs one function :

let route = (routeUrl, param) => {
    let append = [];
    for (let x in param) {
        let search = '{' + x + '}';
        if (routeUrl.indexOf(search) >= 0) {
            routeUrl = routeUrl.replace('{' + x + '}', param[x]);
        } else {
            append.push(x + '=' + param[x]);
        }
    }
    let url = '/' + _.trimStart(routeUrl, '/');
    if (append.length == 0) {
        return url;
    }
    if (url.indexOf('?') >= 0) {
        url += '&';
    } else {
        url += '?';
    }
    url += append.join('&');
    return url;
}

Note 1: ES6 syntax, if you don’t use babel, convert it to ES5

Note 2: Lodash is quoted here

The function of this function is:

route('/blog/{blog}', {blog: 1}); //返回 /blog/1
route('/blog/{blog}', {blog: 1, preview: 1}); //返回 /blog/1?preview=1

Then it’s very simple. In the blade template, define all the paths that need to be used on this page in an object:

var routes = {
    blog: {
        show: '{{ route_uri('blog.show') }}',
        update: '{{ route_uri('blog.update') }}',
        destroy: '{{ route_uri('blog.destroy') }}'
    }
};

In the js file:

$.post(route(routes.blog.update, {blog: 1}), {title: 'xxx', content: 'xxx'})

There is almost no difference between the usage and the back-end route

For more laravel framework technical articles, please visitlaraveltutorial!

The above is the detailed content of Teach you how to implement Laravel’s route function in JS. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:segmentfault.com. If there is any infringement, please contact admin@php.cn delete