1. Go to this page and download the library: Download feroz/dynamic-db-bundle library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Feroz\DynamicDbBundle\Contract\DynamicDbConnectionInterface;
#[ORM\Entity]
class TenantConnection implements DynamicDbConnectionInterface
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $connectionName = null; // e.g., "tenant_1"
#[ORM\Column(length: 255)]
private ?string $dbHost = null;
#[ORM\Column(length: 255)]
private ?string $dbName = null;
#[ORM\Column(length: 255)]
private ?string $dbUser = null;
#[ORM\Column(length: 255)]
private ?string $dbPassword = null;
private ?string $secret = null;
// --- DynamicDbConnectionInterface implementation ---
public function getConnectionName(): string { return $this->connectionName; }
public function getConnectionString(): ?string { return null; } // Optional: Return DSN URL or Oracle TNS string here
public function getDatabaseDriver(): string { return 'pdo_mysql'; } // Hardcode or map a column
public function getDatabaseHost(): string { return $this->dbHost; }
public function getDatabasePort(): int|string { return 3306; }
public function getDatabaseName(): string { return $this->dbName; }
public function getDatabaseUser(): string { return $this->dbUser; }
public function getDatabasePassword(): string { return $this->dbPassword; }
/**
* Called automatically by DynamicDbProvider before the connection config is built.
* The secret is null when none is configured — implement your decryption logic here.
*/
public function setSecret(?string $secret): void
{
$this->secret = $secret;
}
}
namespace App\Controller;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class TenantController extends AbstractController
{
#[Route('/tenant/{tenantName}', name: 'tenant_dashboard')]
public function index(string $tenantName, ManagerRegistry $doctrine): Response
{
// Behind the scenes, the bundle fetches the row matching $tenantName
// and initializes the connection seamlessly!
$connection = $doctrine->getConnection($tenantName);
// Alternatively, grab the dynamic EntityManager
$entityManager = $doctrine->getManager($tenantName);
// Run queries for this specific tenant's database
$results = $connection->executeQuery('SELECT * FROM users')->fetchAllAssociative();
return $this->json($results);
}
}
public function setSecret(?string $secret): void
{
$this->secret = $secret;
}
public function getDatabasePassword(): string
{
if ($this->secret !== null) {
// Decrypt using your own logic / library
return MyEncryptionHelper::decrypt($this->dbPassword, $this->secret);
}
return $this->dbPassword; // Return as-is if no secret configured
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.