3

我的 Laravel 设置了一个 MultiSite Middleware Provider,它检查地址的子域,并基于此子域动态更改与另一个数据库的连接。

例如

  Config::set('database.connections.mysql.host', $config['host'] );
  Config::set('database.connections.mysql.database', $config['db_name'] );
  Config::set('database.connections.mysql.username', $config['user']);
  Config::set('database.connections.mysql.password', $config['password']);
  Config::set('database.connections.mysql.prefix', $config['prefix']);
  Config::set('database.connections.mysql.theme', $config['theme']);

  // purge main to prevent issues (and potentially speed up connections??)
  DB::disconnect('main');
  DB::purge();

  DB::reconnect();
  return $next($request);

这一切都很棒,除了我现在想将 Laravel 队列与内置的数据库驱动程序一起使用(同步实际上工作正常,但会阻碍长报告生成的用户体验)。

除了 Artisan 不确定要连接到哪个数据库,所以我猜它连接到默认数据库,这是一种存储所有子域和相应数据库名称等的主管数据库。

请注意,这些数据库都没有在我的数据库配置中设置为连接,它们存储在一个单一的管理数据库中,因为它们有很多。

我尝试克隆内置的队列侦听器并将其修改为交换到不同的站点连接,如下所示:

/**
 * Create a new queue listen command.
 *
 * @param  \Illuminate\Queue\Listener  $listener
 * @return void
 */
public function __construct(Listener $listener)
{
    // multisite swap
    $site = MultiSites::where('machine_name', $this->argument('site'));
    MultiSites::changeSite($site->id);

    parent::__construct();
    $this->setOutputHandler($this->listener = $listener);
}

但这失败了

Listener 类缺少 $commandPath 参数。

尝试在 fire() 或 handle() 方法中进行类似的数据库/站点交换会停止 $commandPath 错误,但它什么也不做,没有反馈,也没有开始处理数据库中的任何作业。

我不知道如何让它在多站点环境中工作,有没有人有任何想法或者我在这方面走错路了?

我的理想方案是能够运行一个单一的 Queue 命令,让主管监控它并跳过每个数据库检查。但如有必要,我也愿意为每个数据库/站点生成一个队列命令。

4

0 回答 0