Laravel 修补多租户环境
Laravel tinker in multi-tenant environment
我正在使用 Laravel-5.2 开发多租户应用程序
每个租户将有一个单独的数据库。每个租户都有其独立的子域。我检测到租户使用他们的子域。
我设置了模型 Tenant
和 DatabaseConnection
,其中 Tenant hasOne DatabaseConnection
和 DatabaseConnection 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.'],
];
}
那么如何为特定租户设置数据库连接以及如何 运行 修补?
在 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');
看看这是否适合你。
我正在使用 Laravel-5.2 开发多租户应用程序 每个租户将有一个单独的数据库。每个租户都有其独立的子域。我检测到租户使用他们的子域。
我设置了模型 Tenant
和 DatabaseConnection
,其中 Tenant hasOne DatabaseConnection
和 DatabaseConnection 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.'],
];
}
那么如何为特定租户设置数据库连接以及如何 运行 修补?
在 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');
看看这是否适合你。