我正在开发一个API服务,我开发的另一个网站将使用该服务。因此,在本地构建和测试时,显然我希望站点的两个本地副本都可以正常工作。但是,它似乎混淆了environment
变量。
例如:
Site A
有APP_URL=http://a.local
Site B
有APP_URL=http://b.local
- 我从
Site A
代码发送GET
请求(使用Guzzle
http://b.local/test
Site B
的/test
尾部简直是倾倒dump(env('APP_URL'))
Site A
检索的结果"http://a.local"
- 预期成果:
"http://b.local"
因此,Site B
中的代码使用从Site A
加载的环境变量运行。这是一个问题,因为Site B
无法访问正确的数据库,它正在尝试使用Site A
的数据库。
这是我的本地设置(Win10 + WAMP(,PHP设置,Laravel设置的问题吗?
我也遇到了这个问题,这里提到了。它的解决方案是在两个项目中运行php artisan config:cache,以缓存.env文件中的配置或从此处修补代码。
您是否使用工匠命令使用不同的端口运行两个项目?
php artisan serve --port=8000
php artisan serve --port=8010
除了上面的@Daniel Protopopov 答案之外,还有另一种方法,当Site A
和Site B
都是流明时也有效。
简而言之,只需将每侧的DB_DATABASE
变量重命名为不同的名称即可。然后在相应的config/<configfilename>.php
文件中更改相应的变量名称。
这样在Site A
上,您将SITE_A_DB_DATABASE
.env
并在config/database.php
中匹配'database' => env('API_A_DB_DATABASE', 'forge'),
行.
然后,由于变量名称不同,您的Site B
SITE_B_DB_DATABASE
不会被覆盖。
相同的解决方案适用于名称匹配的任何.env
变量。
因为命令php artisan config:cache在这里不起作用(路由文件配置文件中需要关闭(
LogicException : Your configuration files are not serializable.
我用作曲家添加phpdotenv:
composer require vlucas/phpdotenv
在乞求文件"/bootstrap/app.php"(在"new Illuminate\Foundation\Application"之后(,我添加:
$app->detectEnvironment(function () {
$dotenv = DotenvDotenv::create(__DIR__ . '/../', '.env');
$dotenv->overload();
});
也许是另一种选择
如果您使用 GuzzleHttp 从 Laravel 6 应用程序中调用 Lumen 8 API,并且 Laravel env 被继承到 Lumen,创建配置文件对我有用。
在引导程序/应用程序中.php在下面注释以防止从Laravel加载当前环境值
// (new LaravelLumenBootstrapLoadEnvironmentVariables(
// dirname(__DIR__)
// ))->bootstrap();
在引导程序/应用程序中.php在创建$app后添加以下行。
$app->configure('database');
在流明根文件夹中创建配置/数据库.php。在配置文件的数组中返回 Lumen api 所需的所有 env 值。
<?php
return [
'timezone' => 'UTC',
'default' => 'pdbmysql',
'connections' => [
'pdbmysql' => [
'driver' => 'mysql',
'host' => 'localhost',
'port' => '3306',
'database' => 'db2',
'username' => 'root',
'password' => 'root',
],
],
];
您可以在虚拟主机配置或.htaccess
文件中设置环境变量:
SetEnv APP_URL http://b.local