Skip to content

Unresolvable dependency resolving [Parameter #0 [ <required> $taskClassNames ]] in class Spatie\Multitenancy\Tasks\TasksCollection #617

@1YalcinSahin1

Description

@1YalcinSahin1

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions