我目前在Laravel应用程序中使用Algolia作为搜索引擎,因此无论何时创建记录,都会将其发送到Agolia数据库。当然,我想把我在Algolia数据库中的数据与本地开发的测试集和现场网站的生产集分开。我已经定义了我的Algolia数据库的哪些索引正在JavaScript文件中使用。
现在我想知道我如何对我的APP_ENV变量做出相应的反应,以根据我当前的环境进行更改?显然,我需要将内容放入JavaScript中的if
语句中,但如何使JavaScript正确访问.env变量呢?
希望有人能帮我。
干杯。
您可以在视图中将env变量作为javascript字符串进行回显:
<script>
var name = '{{ env('NAME') }}';
alert(name);
</script>
你的.env文件看起来是这样的:
名称=Alex
正如文档所示:您可以使用env
变量,方法是在.env
文件中使用MIX_
作为前缀。
例如:MIX_SENTRY_DSN_PUBLIC=http://example.com
在.env
文件中定义变量后,可以从带有process.env
对象的javascript文件中访问该变量。
例如:process.env.MIX_SENTRY_DSN_PUBLIC
如果从主js文件外部访问env-vars。您可以执行以下操作:
let mix = require('laravel-mix');
require('dotenv').config();
然后:
let my_env_var = process.env.MY_ENV_VAR;
需要mix和dotenv配置即可访问。:(
如果使用vite,它会使用dotenv加载其他ENV变量。这意味着,如果你在.env
中的某个东西前面加上VITE_
,你以后可以在js中使用它作为:
console.log(import.meta.env.VITE_SOME_KEY);
示例:
在.env
:中
MEILISEARCH_HOST=http://localhost:7700
VITE_MEILISEARCH_HOST=$MEILISEARCH_HOST # reusing the variable
在JS中:
console.log(import.meta.env.VITE_MEILISEARCH_HOST);
// ouputs: 'http://localhost:7700'
console.log(import.meta.env.MEILISEARCH_HOST);
// outputs: undefined, so all your other .env vars are safe
更多信息可以在环境变量和模式@vitejs.dev 中找到
有很多方法。
最好的方法之一是将数据从控制器传递到视图:
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应用程序中这样做不是一个好方法。
一个更干净的解决方案是使用laracasts/utilities
包将变量发送到文件中。
使用composer require laracasts/utilities
命令进行安装。
然后在控制器顶部添加use JavaScript;
。
最后以这种方式发送您的变量:JavaScript::put([ 'foo' => $bar ]);
。
首先,确保您可以访问PHP文件或刀片文件中的env文件,您可以查看此答案https://stackoverflow.com/a/60790227/13012364
然后,如果您的javascript文件与刀片文件分开,您可以使用window对象来放置您的env值,例如
window.APP_URL = `{{ config('app.APP_URL') }}`;
之后,您可以使用窗口对象访问javascript文件中的env值
const app_url = window.APP_URL;