【问题标题】:How to access the laravel .env variables inside javascript?如何访问 javascript 中的 laravel .env 变量?
【发布时间】:2016-06-11 13:09:34
【问题描述】:

我目前在 Laravel 应用程序中使用 Algolia 作为我的搜索引擎,因此每当创建记录时,它也会发送到 Agolia 数据库。当然,我想将 Algolia 数据库中的数据与本地开发的测试集和实时网站的生产集分开。我已经定义了我的 Algolia 数据库的哪些索引正在 JavaScript 文件中使用。

现在我想知道如何根据我当前的环境对我的 APP_ENV 变量做出相应的反应来改变它?显然,我需要在我的 JavaScript 中将内容放入 if 语句中,但是如何让我的 javascript 正确访问 .env 变量?

希望有人能帮帮我。

干杯。

【问题讨论】:

  • 您可以创建一个 restful 资源来获取您的环境变量。然后向它发送一个ajax请求。
  • 请注意,允许访问环境变量而无需列出允许和不允许的内容。会相当危险......因为大多数人在那里都有数据库和电子邮件服务器登录。

标签: javascript php laravel environment-variables


【解决方案1】:

首先,确保您可以在 PHP 文件或刀片文件中访问您的 env 文件,您可以查看此答案https://stackoverflow.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 应用程序中执行此操作的好方法。

        【讨论】:

          猜你喜欢
          • 2019-01-29
          • 2017-09-22
          • 2017-08-19
          • 2019-12-03
          • 2018-11-20
          • 2023-03-27
          • 2021-08-07
          • 2021-01-03
          • 1970-01-01
          相关资源
          最近更新 更多