Skip to content

Instantly share code, notes, and snippets.

@ostrolucky
Forked from zak10/symfony multi tenant kernel
Last active July 20, 2018 08:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ostrolucky/16f3d4db05e182e2f0ed8dc27d883185 to your computer and use it in GitHub Desktop.
Save ostrolucky/16f3d4db05e182e2f0ed8dc27d883185 to your computer and use it in GitHub Desktop.
symfony multi tenant kernel
catalog.kernel.request_event_listener:
class: App\CoreBundle\EventListener\KernelBootDatabaseSwitchListener
arguments: [@request, @doctrine.dbal.default_connection, @logger]
scope: request
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
<?php
// KernelContextListener
/**
* KernelContextListener constructor.
* @param Request $request
* @param Connection $connection
* @param $logger
*/
public function __construct(Request $request, Connection $connection, Logger $logger)
{
$this->request = $request;
$this->connection = $connection;
$this->logger = $logger;
}
/**
*
* @throws MissingSiteException
* @throws \Doctrine\DBAL\DBALException
*/
public function onKernelRequest()
{
if ($this->request->get('site')) {
$siteId = $this->request->get('site'); // every request needs site as a param, can change to domain parsing or whatever logic
$connection = $this->connection;
$connectionParameters = $this->connection->getParams();
$databaseName = sprintf("client_%d", $siteId); // here you figure out the database based on the site
$this->logger->debug(sprintf("Switching kernel context to use database %s", $databaseName));
$connectionParameters['dbname'] = $databaseName;
if ($connection->isConnected()) {
$connection->close();
}
// Reconstruct the DB connection and try to connect
$connection->__construct($connectionParameters, $connection->getDriver(), $connection->getConfiguration(), $connection->getEventManager());
$connection->connect();
// if we can't connect, panic
if (!$connection->isConnected()) {
throw new ConnectionException(sprintf("Couldn't connect to database %s", $databaseName));
}
} else {
throw new MissingSiteException();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment