-
-
Notifications
You must be signed in to change notification settings - Fork 174
Open
Description
Version: 4.0.7
As mentioned in the title, I’m getting this error.
My goal is to change not only the database name but also the username, password, and host information when connecting to tenant databases.
To achieve this, I wrote a custom task.
multitenancy.php:
'switch_tenant_tasks' => [
// \Spatie\Multitenancy\Tasks\PrefixCacheTask::class,
// \Spatie\Multitenancy\Tasks\SwitchTenantDatabaseTask::class,
// \Spatie\Multitenancy\Tasks\SwitchRouteCacheTask::class,
\App\Tasks\SwitchDynamicTenantDatabaseTask::class,
],
class SwitchDynamicTenantDatabaseTask implements SwitchTenantTask
{
public function makeCurrent(Tenant|IsTenant $tenant): void
{
$tenant = $tenant->fresh();
$connectionName = "tenant_{$tenant->id}_mysql";
$default_db_key = config('database.default');
$baseTemplate = config("database.connections.{$default_db_key}");
$serverIp = getHostByName(getHostName());
$host = match (true) {
$tenant->server === 'local' => 'mariadb',
$serverIp === 'x.x.x.x' => 'localhost',
default => 'x.x.x.x',
};
$baseTemplate['host'] = $host;
$baseTemplate['database'] = $tenant->database;
$baseTemplate['username'] = $tenant->username;
$baseTemplate['password'] = $tenant->password;
$tenantConnection = $baseTemplate;
Config::set("database.connections.{$connectionName}", $tenantConnection);
Config::set('multitenancy.tenant_database_connection_name', $connectionName);
DB::purge($connectionName);
DB::reconnect($connectionName);
}
public function forgetCurrent(): void
{
$connectionName = config('multitenancy.tenant_database_connection_name');
if ($connectionName && config("database.connections.{$connectionName}")) {
DB::disconnect($connectionName);
}
}
}
I think I’m getting this error because no name was specified during the definition in the code below.
class MakeTenantCurrentAction
{
use BindAsCurrentTenant;
public function __construct(
protected TasksCollection $tasksCollection
) {
}
public function execute(IsTenant $tenant): static
{
event(new MakingTenantCurrentEvent($tenant));
$this
->performTasksToMakeTenantCurrent($tenant)
->bindAsCurrentTenant($tenant);
event(new MadeTenantCurrentEvent($tenant));
return $this;
}
protected function performTasksToMakeTenantCurrent(IsTenant $tenant): static
{
$this->tasksCollection->each(fn (SwitchTenantTask $task) => $task->makeCurrent($tenant));
return $this;
}
}
class TasksCollection extends Collection
{
public function __construct($taskClassNames)
{
$tasks = collect($taskClassNames)
->map(function ($taskParameters, $taskClass) {
if (is_array($taskParameters) && is_numeric($taskClass)) {
$taskClass = array_key_first($taskParameters);
$taskParameters = $taskParameters[$taskClass];
}
if (is_numeric($taskClass)) {
$taskClass = $taskParameters;
$taskParameters = [];
}
return app()->makeWith($taskClass, $taskParameters);
})
->toArray();
parent::__construct($tasks);
}
}
Is there anyone who can help?
Metadata
Metadata
Assignees
Labels
No labels