用于Laravel路由的Javascript中的全局变量 - 这是一个好主意吗?

时间:2016-07-20 10:55:06

标签: javascript php laravel-5 vue.js

我使用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

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

由于

1 个答案:

答案 0 :(得分:2)

我认为你对暴露整个应用程序路线的预感是合法的。 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中提供更多类似Laravel的感觉:function route(path){ return window.routes.hasOwnProperty(path) ? window.routes[path] : null ;}

  • (高级)重写Laravels路由器逻辑并挂钩到options数组,允许你做Route::get('dashboard', '...', ['as'=>'dashboard', 'expose'=>true]);之类的事情,然后动态生成前面提到的json文件在expose选项的所有路线上。