首頁 >php框架 >Laravel >教你在JS實現Laravel的route函數

教你在JS實現Laravel的route函數

藏色散人
藏色散人轉載
2020-05-24 14:17:506890瀏覽

以下由Laravel開發教學專欄為大家介紹Laravel ORM 中你不知道的騷操作,希望對需要的朋友有幫助!

教你在JS實現Laravel的route函數

在Laravel的路由模組裡,我們可以為每一個路由設定一個名字,例如:

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

然後就可以透過route('blog .show', ['blog' => 1]) 來取得到這個路由的存取位址,後端跳轉可以用

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

這樣做的好處是如果發生url變更,例如我想把/blog/{blog}改成/boke/{blog},只要改路由文件,別的地方都不用調整。所以推薦給每個路由都命個名,並透過路由名的方式來取得。

但這個僅限於後端以及blade模板可以使用,稍微上點規模的網站都會把js檔案單獨拎出來,不會把js直接寫在blade模板中,這樣就導致js裡發ajax請求時或頁面跳轉時只能將請求位址寫死,例如

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

這樣萬一路由發生變更,還得去修改js文件,如果同一個路由被多個js調用,很容易漏改那麼一兩個。

所以我就考慮能不能在js中實作一個類似後端的route函數。

最終的解決方案很簡單,兩個函數就可以搞定。

後端部分需要實作一個函數:

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

這個函數的功能是根據路由名稱傳回原始的路由位址,例如:

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

前端也只需要一個函數:

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;
}

註1:ES6語法,如果沒用babel的自行轉ES5

#註2:這裡引用了lodash

這個函數的作用是:

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

然後就很簡單了,在blade模板中把這個頁面所有需要用到的路定義在一個物件中:

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

在js檔案裡就可以:

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

用法和後端的route幾乎沒有差別

更多laravel框架技術文章,請訪問laravel教程!

以上是教你在JS實現Laravel的route函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除