我有一个多租户应用程序,其中租户由请求中的HTTP_HOST
确定。这是在服务提供商中决定的,这是config/app.php
providers
数组中列出的第一件事。
在此服务提供程序中,我使用以下内容重载env变量:
public function boot(Request $request)
{
$tenant = $request->server->get('HTTP_HOST');
$dotenv = new \Dotenv\Dotenv(base_path('sites' . DIRECTORY_SEPARATOR . $tenant . DIRECTORY_SEPARATOR . 'config'));
$dotenv->overload();
}
基本上,查看sites/site_name/config
文件夹中的.env文件。如果我运行php artisan tinker
并回显出env('DATABASE_USER')
之类的env变量,这也可以正常工作。问题在于数据库无法读取此重载的env文件。在任何服务提供者config/database.php
方法运行之前,数据库服务是否在boot
中读取配置?
我已经这样做了:
Config::set('database.default', 'mysql');
Config::set('database.connections.mysql.host', env('DB_HOST'));
Config::set('database.connections.mysql.port', env('DB_PORT'));
Config::set('database.connections.mysql.database', env('DB_DATABASE'));
Config::set('database.connections.mysql.username', env('DB_USERNAME'));
Config::set('database.connections.mysql.password', env('DB_PASSWORD'));
哪个有效,但有没有更好的方法来引导过程中的env文件以防止这种情况?
答案 0 :(得分:0)
您可以在 A.assign(**d)
a b c d e newcol1 newcol2 newcol3
0 0.709249 0.275538 0.135320 0.939448 0.549480 a 2 1
1 0.396744 0.513155 0.063207 0.198566 0.487991 a 2 1
2 0.230201 0.787672 0.520359 0.165768 0.616619 a 2 1
3 0.300799 0.554233 0.838353 0.637597 0.031772 a 2 1
4 0.003613 0.387557 0.913648 0.997261 0.862380 a 2 1
5 0.504135 0.847019 0.645900 0.312022 0.715668 a 2 1
6 0.857009 0.313477 0.030833 0.952409 0.875613 a 2 1
7 0.488076 0.732990 0.648718 0.389069 0.301857 a 2 1
8 0.187888 0.177057 0.813054 0.700724 0.653442 a 2 1
9 0.003675 0.082438 0.706903 0.386046 0.973804 a 2 1
中更改要加载的.env
个文件。创建bootstrap/app.php
*后,使用方法$app
。您项目中的原始useEnvironmentPath($path)
将被完全忽略。
您可能无法访问此文件中的Request对象,因此请使用.env
。
如果您想在命令行上进行更改,请检查PHP_SAPI是否为“cli”并通过命令选项检索租户:
$_SERVER['HTTP_HOST']
您需要将--tenant添加到Console \ Application作为默认命令选项。修改<?php
if(PHP_SAPI === 'cli') {
$tenant = (new ArgvInput())->getParameterOption('--tenant');
} else {
$tenant = $_SERVER['HTTP_HOST'];
}
if(empty($tenant) === false) {
$app->useEnvironmentPath("/path/to/$tenant/config/")
}
以返回App\Console\Kernel::getArtisan()
扩展对象。
应用/控制台/ Kernel.php 强>
Illuminate\Console\Application
应用/控制台/ Application.php 强>
<?php
# [...]
protected function getArtisan()
{
if (is_null($this->artisan)) {
return $this->artisan = (new \App\Console\Application($this->app, $this->events, $this->app->version()))
->resolveCommands($this->commands);
}
return $this->artisan;
}
*您还必须覆盖Laravel配置的缓存路径。它在<?php
namespace App\Console;
use Illuminate\Console\Application as Artisan;
use Symfony\Component\Console\Input\InputOption;
class Application extends Artisan
{
protected function getDefaultInputDefinition()
{
$definition = parent::getDefaultInputDefinition();
$definition->addOption(new InputOption('--tenant', null, InputOption::VALUE_OPTIONAL, "Tenant to be used");
return $definition;
}
}
中,因此扩展此类并在Illuminate\Foundation\Application::getCachedConfigPath()
中使用该类。