【问题标题】:Laravel tinker in multi-tenant environment多租户环境中的 Laravel 修补程序
【发布时间】:2017-01-05 01:24:31
【问题描述】:

我正在使用 Laravel-5.2 开发一个多租户应用程序 每个租户都有一个单独的数据库。每个租户都有其单独的子域。我使用他们的子域检测租户。

我设置了模型TenantDatabaseConnection,其中Tenant hasOne DatabaseConnectionDatabaseConnection belongsTo Tenant。 租户的数据库连接从BeforeMiddleware 动态设置。这些都很好用。

现在我想为租户使用artisan tinker。但如果我运行php artisan tinker,它会连接到Tenant,其数据库凭据存在于.env 文件中。

所以我正在尝试为此创建一个控制台命令。这是我到目前为止所取得的成就。

class ClientTinker extends Command {

    protected $name = 'cdb:tinker';

    public function fire()
    {
        // get the subdomain
        $subdomain = $this->argument('subdomain');

        // get the client
        $client = Tenant::whereSubdomain($subdomain)->first();

        $connection = $client->databaseConnection();
        // $connection contains the database server, database name, user name, and password.
        // dynamically set connections here. *How?*
        ...

        // *I need to call tinker here. How?* 
    }

    protected function getArguments()
    {
        return [
            ['subdomain', InputArgument::REQUIRED, 'Subdomain of the tenant.'],
        ];
    }

那么如何为特定租户设置数据库连接以及如何运行 tinker?

【问题讨论】:

  • 您是否尝试向特定租户发出tinker 的控制台命令?
  • 是的。这样我就不必在运行tinker 之前不断更改.env 文件中的数据库凭据。

标签: php laravel laravel-5.2 multi-tenant


【解决方案1】:

在获得fire() 中的$connection 变量后,执行此操作

DB::purge('mysql');

Config::set('database.connections.mysql.host', $connection->server);
Config::set('database.connections.mysql.database', $connection->database);
Config::set('database.connections.mysql.username', $connection->username);
Config::set('database.connections.mysql.password', $connection->password);
// I am assuming the variable names in $connection object here, as you have not specified them in your question.

Artisan::call('tinker');

看看这是否适合你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    相关资源
    最近更新 更多