- verwendet die spain_db.
Code: Select all
spain.example.com
- verwendet die india_db.
Code: Select all
india.example.com
Code: Select all
IdentifyTenant
Code: Select all
config([
'database.connections.custom' => [
'driver' => 'mysql',
'host' => $tenantDetails['db_host'],
'database' => $tenantDetails['db_name'],
'username' => $tenantDetails['db_user'],
'password' => $tenantDetails['db_password'],
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
]);
DB::setDefaultConnection('custom');
Das Problem: Warteschlangenarbeiter
Wenn ich php artisan queue:work oder php artisan queue:listen wählt der Warteschlangenarbeiter immer die Standarddatenbank aus .env-Datei. In meinem Fall muss der Worker jedoch die Datenbankverbindung basierend auf den im Job gespeicherten Mandantendetails dynamisch bestimmen.
< h3>Was ich versucht habe:
[*]Übergabe von Mandantendetails in der Job-Nutzlast:
Ich habe beim Versenden des Auftrags mieterspezifische Details in den Auftrag aufgenommen:
Code: Select all
$tenantDetails = [
'db_host' => '127.0.0.1',
'db_name' => 'spain_db',
'db_user' => 'root',
'db_password' => '',
];
YourJob::dispatch($tenantDetails);
Code: Select all
config([
'database.connections.custom' => [
'driver' => 'mysql',
'host' => $this->tenantDetails['db_host'],
'database' => $this->tenantDetails['db_name'],
'username' => $this->tenantDetails['db_user'],
'password' => $this->tenantDetails['db_password'],
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
]);
DB::setDefaultConnection('custom');
Ich habe einen Hörer für die Jobprozessierung erstellt < /Code> Ereignis zur dynamischen Konfiguration der Mieterdatenbank: < /p>
Code: Select all
namespace App\Listeners;
use Illuminate\Queue\Events\JobProcessing;
use Illuminate\Support\Facades\DB;
class SetTenantForQueue
{
public function handle(JobProcessing $event)
{
$tenantDetails = $event->job->payload()['data']['tenantDetails'] ?? null;
if ($tenantDetails) {
config([
'database.connections.custom' => [
'driver' => 'mysql',
'host' => $tenantDetails['db_host'],
'database' => $tenantDetails['db_name'],
'username' => $tenantDetails['db_user'],
'password' => $tenantDetails['db_password'],
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
]);
DB::setDefaultConnection('custom');
}
}
}
use Illuminate\Queue\Events\JobProcessing;
use App\Listeners\SetTenantForQueue;
protected $listen = [
JobProcessing::class => [
SetTenantForQueue::class,
],
];
< /code>
< /li>
< /ol>
Das Problem: < /strong> < /h3> < BR /> Trotz dieser Versuche scheint der Mitarbeiter die Standarddatenbank aus der Datei .env < /code> bei der Ausführung des Jobs auszuwählen. Wie kann ich sicherstellen, dass der Warteschlangenarbeiter die Mieterdatenbank dynamisch basierend auf der Subdomain oder der Jobnutzlast verwendet? < /strong> < /h3>
Wie kann ich den Warteschlangenarbeiter von Laravel so konfigurieren, dass die Datenbankverbindung für jeden Job dynamisch festgelegt wird? < /li>
Gibt es eine bessere Möglichkeit, Multitenant-Datenbanken mit Warteschlangen in Laravel zu verarbeiten? )? < /li>
< /ol>
Ich würde mich wirklich an Ratschläge oder Best Practices für die Behandlung dieses Szenarios in einer vielfältigen Architektur freuen. Danke im Voraus!