2017-01-16 4 views
1

Es ist möglich, verschiedene Parameter.yml auf Symfony zu laden? Ich habe eine SaaS Multitenant APP und ich möchte laden differents parameters.yml (mit config DB) Basis auf jedem Mieter, um den Benutzer auf die richtige DB bei der Anmeldung Aktion zu entsenden.Symfony: Es ist möglich, verschiedene Parameter laden.yml?

Vielen Dank!

Bearbeiten: Gelöst!

Ich löste es die verschiedenen Mieter Konfigurationen in Ordnern wie die Anordnung:

app 
---config 
------tenantA 
---------config.yml 
---------config_dev.yml 
---------config_prod.yml 
---------parameters.yml 
------tenantB 
---------config.yml 
---------config_dev.yml 
---------config_prod.yml 
---------parameters.yml 
------tenantC 
---------config.yml 
---------config_dev.yml 
---------config_prod.yml 
---------parameters.yml 
.... 

Und Modifizieren des Laders von kernelApp.php:

$ loader-> load ($ this-> getRootDir (). '/ config/TENANT /config_'.$this->getEnvironment().'.yml');

Ich weiß nicht, ob dies eine gute Praxis ist, aber es funktioniert gut!

+0

Wenn Sie Lehre Migrationen verwenden möchten, werden Sie auf ein Problem stoßen, weil es unabhängig von dieser config . Ich habe eine Lösung, wenn Sie zu Doktrin Migrationen gehen möchten, können Sie es hier lesen, und ich sage Ihnen Dank, weil Sie mich auf die richtige Richtung der Verwendung mehrerer Datenbanken und derselben Quelle wies ;-) https: //stackoverflow.com/questions/45633339/symfony3-doctrine-migration-with-multiple-databases – rebru

Antwort

0

Sie haben hier mehrere Möglichkeiten.

Wenn die Nummer des Mieters konstant ist oder ihr nahe kommt (neue Mieter werden sehr selten hinzugefügt), können Sie einfach mehrere Verbindungen einrichten, wie beschrieben here. Danach können Sie durch den Aufruf

$em = $this->get('doctrine')->getManager($dynamicValue); 

Nachteil dieses Ansatzes erforderlich EntityManager Instanz erhalten, ist, dass Sie Ihre config.yml jedes Mal, wenn Sie benötigen/Update erstellen ändern müssen/einen Mieter löschen.

Aber wenn Sie wollen flexibleren Ansatz Sie Ihre eigene Klasse für die Verwaltung von Datenbankverbindungen implementieren können:

<?php 

namespace AppBundle\Service; 

use AppBundle\Entity\Database; 
use Doctrine\DBAL\Connection; 
use Doctrine\DBAL\DBALException; 
use Doctrine\DBAL\DriverManager; 

/** 
* Class ConnectionManager 
* @package AppBundle\Service 
*/ 
class ConnectionManager 
{ 
    /** 
    * @var Connection[] 
    */ 
    protected $connections = []; 

    /** 
    * @param Database $database 
    * @return Connection 
    * @throws DBALException 
    */ 
    public function getConnection(Database $database) 
    { 
     $params = [ 
      'dbname' => $database->getName(), 
      'user' => $database->getUser(), 
      'password' => $database->getPassword(), 
      'host' => $database->getHost(), 
      'driver' => 'pdo_mysql', 
     ]; 

     $key = $this->getKey($params); 
     if (isset($this->connections[$key])) { 
      return $this->connections[$key]; 
     } 

     $conn = DriverManager::getConnection($params); 
     $this->connections[$key] = $conn; 
     return $conn; 
    } 

    /** 
    * @param array $params 
    * @return string 
    */ 
    protected function getKey($params) 
    { 
     sort($params); 
     return md5(implode('.', $params)); 
    } 
} 
+0

Dank @Andrey. Ich suche nach dispacht de "login" order auf symfony zur richtigen DB. Ich habe viele Datenbanken (eine für jeden Mandanten), aber wenn sich ein Benutzer bei symfony anmeldet, attackiert der Auftrag die DB, die auf parameters.yml definiert ist. Ich suche nur nach der korrekten Paramemers.yml durch die Domäne, bevor ein Benutzer sich in Symfony anmeldet. (Sorry über mein Englisch: /) –

+0

@CarlosCarmona - Klingt wie Sie wollen eine andere parameter.yml basierend auf der Anfrage? Das wird nicht passieren. Der gesamte Konfigurationskram wird einmal ausgeführt und dann zwischengespeichert. Es wird immer für jede Anfrage gleich sein. Sie müssen etwas tun, wie diese Antwort vorschlägt. – Cerad

+0

@Andrey Ich habe es gelöst arrangieren die verschiedenen Mieter-Konfigurationen in verschiedenen Ordnern in (app/config/tenantX), Laden von appKernel de corret Umgebung nach Domäne. Es funktioniert gut!! :) –

Verwandte Themen