如何访问 javascript 中的 laravel .env 变量?
Posted
技术标签:
【中文标题】如何访问 javascript 中的 laravel .env 变量?【英文标题】:How to access the laravel .env variables inside javascript? 【发布时间】:2016-06-11 13:09:34 【问题描述】:我目前在 Laravel 应用程序中使用 Algolia 作为我的搜索引擎,因此每当创建记录时,它也会发送到 Agolia 数据库。当然,我想将 Algolia 数据库中的数据与本地开发的测试集和实时网站的生产集分开。我已经定义了我的 Algolia 数据库的哪些索引正在 javascript 文件中使用。
现在我想知道如何根据我当前的环境对我的 APP_ENV 变量做出相应的反应来改变它?显然,我需要在我的 JavaScript 中将内容放入 if
语句中,但是如何让我的 javascript 正确访问 .env 变量?
希望有人能帮帮我。
干杯。
【问题讨论】:
您可以创建一个 restful 资源来获取您的环境变量。然后向它发送一个ajax请求。 请注意,允许访问环境变量而无需列出允许和不允许的内容。会相当危险......因为大多数人在那里都有数据库和电子邮件服务器登录。 【参考方案1】:首先,确保您可以在 php 文件或刀片文件中访问您的 env 文件,您可以查看此答案https://***.com/a/60790227/13012364
然后,如果你的 javascript 文件和你的刀片文件分开,你可以使用 window 对象来放置你的 env 值,例如
window.APP_URL = ` config('app.APP_URL') `;
之后,您可以使用 window 对象在 javascript 文件中访问该 env 值
const app_url = window.APP_URL;
【讨论】:
【参考方案2】:As the documentation suggests:您可以使用env
变量,方法是在您的.env
文件中添加MIX_
前缀。
例如:MIX_SENTRY_DSN_PUBLIC=http://example.com
在您的.env
文件中定义变量后,您可以从带有process.env
对象的javascript 文件访问它。
例如:process.env.MIX_SENTRY_DSN_PUBLIC
【讨论】:
只有在使用 vue 组件时才适用。如果您只是使用普通刀片模板,这是不准确的。 它也适用于带有 env('MIX_SENTRY_DSN_PUBLIC')
的普通刀片模板。
github.com/JeffreyWay/laravel-mix/issues/1155 。只需要求 mix 并要求 dotenv 配置文件。然后它解决了问题:) 任何脚本都可以通过这种方式访问 ENV 变量。
您甚至可以在 .env 文件中使用扩展变量,例如 MIX_APP_ENV=$APP_ENV
,并在 js 中使用 process.env.MIX_APP_ENV
访问它,这样您就不必写两次 vars
这是最正确的答案。更改或添加变量后记得重启编译任务【参考方案3】:
如果从主 js 文件之外访问环境变量。您可以执行以下操作:
let mix = require('laravel-mix');
require('dotenv').config();
然后:
let my_env_var = process.env.MY_ENV_VAR;
需要 mix 和 dotenv 配置才能让您访问。 :)
【讨论】:
【参考方案4】:更简洁的解决方案是使用 laracasts/utilities
包将变量发送到文件。
使用composer require laracasts/utilities
命令安装它。
然后在控制器顶部添加use JavaScript;
。
最后以这种方式发送您的变量:JavaScript::put([ 'foo' => $bar ]);
。
【讨论】:
【参考方案5】:您可以在视图中将 env 变量作为 javascript 字符串回显:
<script>
var name = ' env('NAME') ';
alert(name);
</script>
您的 .env 文件将如下所示:
NAME=亚历克斯
【讨论】:
我现在所做的差不多。我只是希望有更好的或预制的方法,因为我认为很多人可能会遇到这种情况,您需要在 javascript 中检查您的环境。感谢您的帮助! 由于撇号的顺序,这将是语法错误您可以这样做 ' env("NAME") ';或者这样做 " env('NAME') "; 不,不会出错,大括号是刀片标记,它们之间的代码在运行 JavaScript 代码之前会在服务器端呈现。【参考方案6】:有很多方法。
最好的方法之一是将数据从 Controller 传递到视图:
if ($app->environment('local'))
// Here you can generate some <script></script> code or you could just generate
// hidden div like <div id="environment" style="display:none">local</div>
或者像这样:
return view('myView')->with('env', $app->environment());
或者你可以使用会话:
\Session::put('env', $app->environment())
当然,您可以创建专用路由并使用 Ajax 获取它,但我认为这不是在现实生活中的 Web 应用程序中执行此操作的好方法。
【讨论】:
以上是关于如何访问 javascript 中的 laravel .env 变量?的主要内容,如果未能解决你的问题,请参考以下文章
Django 如何正确访问 javascript 中的上下文数组?