- использует spain_db.
Код: Выделить всё
spain.example.com
- использует india_db.
Код: Выделить всё
india.example.com
Код: Выделить всё
IdentifyTenant
Код: Выделить всё
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');
< /code>
Это отлично работает для [b] http -запросов < /strong>, а подключение к базе данных динамически устанавливается на основе субдомена. < /p>
< br/> Проблема: queue raffsies [/b]
Когда я запускаю очередь PHP Artisan: work
< h3> то, что я пробовал:
[*] Пропустить подробности арендатора в работой полевой нагрузке:
Я включил подробную информацию в задании, специфичную для арендатора при его отправке: < /p>
Код: Выделить всё
$tenantDetails = [
'db_host' => '127.0.0.1',
'db_name' => 'spain_db',
'db_user' => 'root',
'db_password' => '',
];
YourJob::dispatch($tenantDetails);
Код: Выделить всё
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');
Я создал прослушиватель JobProcessing< /code> событие для динамической настройки базы данных арендаторов:
Код: Выделить всё
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>
Проблема: < /strong> < /h3> < Br /> Несмотря на эти попытки, работник все еще, кажется, выбирает базу данных по умолчанию из файла .env < /code> при выполнении задания. Как я могу гарантировать, что работник очереди динамически использует базу данных арендаторов на основе субдомена или полезной нагрузки? < /strong> < /h3>
Как я могу настроить работник очереди Laravel для динамического установки подключения к базе данных для каждого задания? < /li>
Есть ли лучший способ обработать многопользовательские базы данных с очередями в Ларавеле? )? Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/793 ... chitecture