WAMP Laravel - 从一个本地站点向另一个站点发送 API 请求会混淆环境变量

WAMP Laravel - Sending API requests from one local site to another mixes up environment variables

我正在开发一项 API 服务,我开发的另一个站点将使用该服务。所以在本地构建和测试时,显然我希望站点的两个本地副本都能正常工作。但是,它似乎混淆了 environment 个变量。

例如:

所以Site B中的代码是运行从Site A加载的环境变量。这是一个问题,因为 Site B 无法访问正确的数据库,它正在尝试使用 Site A 的数据库。

这是我的本地设置 (Win10 + WAMP)、PHP 设置、Laravel 设置的问题吗?

您是否使用 artisan 命令 运行 两个具有不同端口的项目?

php artisan serve --port=8000

php artisan serve --port=8010 

我也遇到这个问题,提到here. The resolution for it is to run php artisan config:cache in both projects to cache configuration from .env files or patch the code from here

您可以在 vhost 配置或 .htaccess 文件中设置环境变量:

SetEnv APP_URL http://b.local

除了@Daniel Protopopov 的回答 还有另一种方法,当 Site ASite B 都是 Lumen 时也可以使用。

简而言之,只需将每一侧的 DB_DATABASE 变量重命名为不同的名称。然后在各自的config/<configfilename>.php文件中更改各自的变量名。

所以在 Site A 上你会在 .env 中有 SITE_A_DB_DATABASE 并在 config/database.php 中有匹配的 'database' => env('API_A_DB_DATABASE', 'forge'), 行。

那么你的Site BSITE_B_DB_DATABASE不会因为变量名不同而被覆盖

相同的解决方案适用于名称匹配的任何 .env 个变量。

因为命令 php artisan config:cache 在这里不起作用(routes 文件 中需要关闭配置文件)

LogicException  : Your configuration files are not serializable.

我用作曲家添加 phpdotenv :

composer require vlucas/phpdotenv

在文件“/bootstrap/app.php”的开头(在 "new Illuminate\Foundation\Application" 之后),我添加:

$app->detectEnvironment(function () {
    $dotenv = Dotenv\Dotenv::create(__DIR__ . '/../', '.env');
    $dotenv->overload();
});

也许是另一种选择

如果您使用 GuzzleHttp 从 Laravel 6 应用程序中调用 Lumen 8 API,并且 Laravel 环境被继承到 Lumen,创建配置文件对我有用。

在 bootstrap/app.php 行下方注释以防止从 Laravel

加载当前环境值
// (new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
//     dirname(__DIR__)
// ))->bootstrap();

在 bootstrap/app.php 中,在创建 $app 后添加下面一行。

$app->configure('database');

在 lumen 根文件夹中创建 config/database.php。 Return 流明所需的所有环境值 api 在配置文件的数组中。

<?php
return [
'timezone' => 'UTC',
'default' => 'pdbmysql',
'connections' => [
    'pdbmysql' => [
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'port'      => '3306',
        'database'  => 'db2',
        'username'  => 'root',
        'password'  => 'root',
    ],

],
];