在通过服务提供商

时间:2016-10-27 20:56:22

标签: laravel

我有一个多租户应用程序,其中租户由请求中的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文件以防止这种情况?

1 个答案:

答案 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()中使用该类。