Laravel Routes的Javascript中的全局变量-这是个好主意吗


Global Variable in Javascript for Laravel Routes - Is this a good idea?

我使用View Composer创建了一些代码,在那里我将我的Route Collection传递到所有视图的前端,这样我就可以通过与它们相关联的名为的路由访问Vuejs中的所有laravel路由。

例如,要使用vue组件上传图像,而不是将我的上传路线传递到vue组件,它被列为全局变量的一部分:

var uploadRoute     = _.find(globalRoutes, function(route) { return route.name == 'route-name.image.upload' });
$.post(uploadRoute, data) ... etc

我的问题是…这明智吗?我正在公开发布我的整个应用程序的路线。

感谢

我认为你对暴露整个应用程序路由的预感是合法的。IMO你应该明确选择你需要的路线。因此,在这种情况下,您应该只公开route-name.image.upload。您可以创建一个小型助手函数来查找路由,并将它们与URL一起输出为JSON。

function json_routes(array $routes)
{
   $return = [];
   foreach($routes as $route)
   {
       $return[$route] = route($route);
   }
   return new 'Illuminate'Support'HtmlString(json_encode($return));
}

在你的主视图中:

var routes = {{ json_routes(["route-name.image.upload"]) }};

获取路线很简单:

routes['route-name.image.upload']; 

这是我能想到的最基本的例子。您可以对其进行大量优化。只是一些想法:

  • 将管线放置在中心位置,fx。配置元素:json_routes(config('app.json_routes'))
  • 生成一个生成静态.json文件的命令,这样就不会在每次页面加载时遍历路由。请记住,添加更多路线时要重新生成
  • 创建一个函数而不是一个对象来获取路线。这允许您构建逻辑,并在js:function route(path){ return window.routes.hasOwnProperty(path) ? window.routes[path] : null ;} 中提供更像Laravel的感觉

  • (高级)重写Laravels路由器逻辑并挂接到选项数组中,允许您执行类似Route::get('dashboard', '...', ['as'=>'dashboard', 'expose'=>true]);的操作,然后使用expose选项在所有路由上动态生成前面提到的json文件。