所有 Laravel 路由都暴露了。如果可能,如何将其移动到 app.js 或缩小

Posted

技术标签:

【中文标题】所有 Laravel 路由都暴露了。如果可能,如何将其移动到 app.js 或缩小【英文标题】:All Laravel routes exposed. How to move it to app.js or minify if possible 【发布时间】:2021-05-16 08:14:34 【问题描述】:

我在我的 Laravel、Vue.js 和 Inertia js 项目中使用 Ziggy。在查看页面源码中,我可以清楚地看到所有的 Laravel 路由。

<script type="text/javascript">
    const Ziggy = "url":"http:\/\/127.0.0.1:8787","port":8787,"defaults":,"routes": 
    ......

"sup_finish_tt_order":"uri":"front\/finishorder","methods":["POST"],"assign__tt":"uri":"front\/assigntt","methods":["POST"],"technicians":"uri":"technicians","methods":["GET","HEAD"],"change-password":"uri":"change-password","methods":["GET","HEAD"],"reset.password":"uri":"c
----------
</script>

有什么方法可以在 app.js 中重新定位这个 Ziggy 对象或让它不那么明显?根据Ziggy 文档和此处尝试的答案,我尝试在 app.js 中导入它,但它不起作用。

未捕获的类型错误:无法读取未定义的属性“原型” 在 Object.inherits (app.js:124712) 在对象。 (app.js:68991) 在 Object../node_modules/irc/lib/irc.js (app.js:69342) 在 webpack_require (app.js:64) 在 Object../node_modules/ziggy/index.js (app.js:140181) 在 webpack_require (app.js:64) 在模块../resources/js/app.js (app.js:141504) 在 webpack_require (app.js:64) 在 Object.0 (app.js:142081) 在 webpack_require (app.js:64)

___________________________设置 __________________________________

//后端

$ php artisan ziggy:generate
File generated!

// 示例 /resources/js/ziggy.js 文件

const Ziggy = "url":"http:\/\/127.0.0.1:8787","port":8787,"defaults":,"routes":"debugbar.openhandler":"uri":"_debugbar\/open"  /*..... All named routes as expeted */


if (typeof window !== 'undefined' && typeof window.Ziggy !== 'undefined') 
    for (let name in window.Ziggy.routes) 
        Ziggy.routes[name] = window.Ziggy.routes[name];
    


export  Ziggy ;


// /resources/js/app.js

require('./bootstrap')
import Vue from 'vue'
import VueMeta from 'vue-meta'
import PortalVue from 'portal-vue'
import  App, plugin  from '@inertiajs/inertia-vue'
import  InertiaProgress  from '@inertiajs/progress/src'

// Ziggy start here
import route from 'ziggy';
import  Ziggy  from './ziggy';

Vue.mixin(
    methods: 
        route: (name, params, absolute, config = Ziggy) => route(name, params, absolute, config),
    ,
);
// ziggy end here



import  BootstrapVue, IconsPlugin  from 'bootstrap-vue'
Vue.use(BootstrapVue)
Vue.use(IconsPlugin)
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
import  mixins  from 'vue-chartjs'
import TreeBrowser from './Pages/globalComponents/TreeBrowser.vue'
//Vue.config.productionTip = false
Vue.mixin( methods:  route: window.route  )
Vue.use(plugin)
Vue.use(PortalVue)
Vue.use(VueMeta)
Vue.component('TreeBrowser', TreeBrowser)
InertiaProgress.init()

let app = document.getElementById('app')

new Vue(
    metaInfo: 
        titleTemplate: (title) => title ? `$title - FNV` : 'FNV yours'
    ,
    render: h => h(App, 
        props: 
            initialPage: JSON.parse(app.dataset.page),
            resolveComponent: name =>
                import (`./Pages/$name`).then(module => module.default),
        ,
    ),
).$mount(app)

// /webpack.mix.js

const mix = require('laravel-mix');
const path = require('path');
mix.js('resources/js/app.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css');

mix.webpackConfig(
    resolve: 
        alias: 
            ziggy: path.resolve('vendor/tightenco/ziggy/dist'),
        ,
    ,
);

Login.vue 中 ziggy ex 的使用

this.$inertia.post(this.route('login.attempt'), data, 
        onStart: () => this.sending = true,
        onFinish: () => this.sending = false,
      )
    ```

【问题讨论】:

我可以问“为什么”吗?您的 javascript 代码必须以一种或另一种方式知道路由,因此无论如何它都会暴露出来 然而,但它们至少不在 html 中。 基于接受的答案并通过删除 ``` Vue.mixin( methods: route: window.route ) ``` 它的工作原理 【参考方案1】:

如果您不使用 Blade,或者不想使用 @routes 指令,Ziggy 提供了一个 artisan 命令来将其配置和路由输出到文件:php artisan ziggy:generate

import route from 'ziggy';
import  Ziggy  from './ziggy';

Vue.mixin(
    methods: 
        route: (name, params, absolute, config = Ziggy) => route(name, params, absolute, config),
    ,
);

您可以选择创建一个 webpack 别名,以便更轻松地导入 Ziggy 的核心源文件

// webpack.mix.js

// Mix v6
const path = require('path');

mix.alias(
    ziggy: path.resolve('vendor/tightenco/ziggy/dist'),
);

// Mix v5
const path = require('path');

mix.webpackConfig(
    resolve: 
        alias: 
            ziggy: path.resolve('vendor/tightenco/ziggy/dist'),
        ,
    ,
);

这意味着你应该在这里改变路径'.ziggy'

import  Ziggy  from './ziggy';

【讨论】:

由于来自“ziggy”的导入路径,应用程序未安装;未捕获的类型错误:无法在 Object../node_modules/irc/lib/irc.js ( app.js:69342) 在 webpack_require (app.js:64) 在 Object../node_modules/ziggy/index.js (app.js:140181) 在 webpack_require (app.js:64) 在 Module../resources/js/app.js (app.js:141504) 在 webpack_require (app.js:64) 在 Object.0 (app.js :142081) 在 webpack_require (app.js:64) 您是否更改了这一行的路径?从'./ziggy'导入 Ziggy ;还是为 webpack 别名添加? 不,没有任何改变,我照原样复制上面的答案/小便文档。 我改了答案,请检查【参考方案2】:

这里是 Ziggy 的维护者。 FightInGlory's answer 是正确的。

运行php artisan ziggy:generate

然后,在您的webpack.mix.js 文件中:

const path = require('path');

// Mix v6
mix.alias(
    ziggy: path.resolve('vendor/tightenco/ziggy/dist'),
);

// Or, Mix v5
mix.webpackConfig(
    resolve: 
        alias: 
            ziggy: path.resolve('vendor/tightenco/ziggy/dist'),
        ,
    ,
);

然后,在您要使用 Ziggy 的文件中:

import route from 'ziggy';
// Change './ziggy' to the relative path to the file generated above, usually resources/js/ziggy.js
import  Ziggy  from './ziggy';

// ...

route('posts.show', 1, undefined, Ziggy);

如果您使用的是 Vue,创建一个全局 mixin 会很有帮助,这样您就不需要每次都将 Ziggy 作为第四个参数传入。有一个如何设置的示例in the docs。

如果这仍然不起作用,请随时提交问题并详细说明您的设置!

【讨论】:

我正在创建问题,仅供参考,详细信息已添加到问题中。 @bakerkretzmar 我不断收到“TypeError:this.route 不是函数”。有什么建议吗? TypeError: Cannot call a class as a function 也是我不断遇到的另一个错误。我做错了什么? @oluwatyson 对于TypeError,请确保您使用Vue.mixin( methods: route ) 之类的mixin 在所有Vue 组件中提供路由功能。您使用的是 Ziggy v1 吗?随时在 repo 中提出问题,我们可以仔细查看! github.com/tighten/ziggy/issues

以上是关于所有 Laravel 路由都暴露了。如果可能,如何将其移动到 app.js 或缩小的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AngularJs 处理 Laravel 路由?

如何创建仅用于测试的 Laravel 路由(phpunit)?

Laravel 控制器

Laravel 控制器

Laravel 除了 '/' 之外的所有路由都返回 404

Spring Cloud 学习——6.zuul实现路由负载均衡安全验证