WAMP Laravel - 从一个本地站点向另一个站点发送 API 请求会混淆环境变量
WAMP Laravel - Sending API requests from one local site to another mixes up environment variables
我正在开发一项 API 服务,我开发的另一个站点将使用该服务。所以在本地构建和测试时,显然我希望站点的两个本地副本都能正常工作。但是,它似乎混淆了 environment
个变量。
例如:
Site A
有 APP_URL=http://a.local
Site B
有 APP_URL=http://b.local
- 我从
Site A
代码向 http://b.local/test
发送了一个 GET
请求(使用 Guzzle
)
-
Site B
中的 /test
endpoing 简单地转储 dump(env('APP_URL'))
Site A
检索到的结果是 "http://a.local"
- 预期结果:
"http://b.local"
所以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 A
和 Site 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 B
SITE_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',
],
],
];
我正在开发一项 API 服务,我开发的另一个站点将使用该服务。所以在本地构建和测试时,显然我希望站点的两个本地副本都能正常工作。但是,它似乎混淆了 environment
个变量。
例如:
Site A
有APP_URL=http://a.local
Site B
有APP_URL=http://b.local
- 我从
Site A
代码向http://b.local/test
发送了一个 -
Site B
中的/test
endpoing 简单地转储dump(env('APP_URL'))
Site A
检索到的结果是"http://a.local"
- 预期结果:
"http://b.local"
GET
请求(使用 Guzzle
)
所以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 A
和 Site 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 B
SITE_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',
],
],
];