2017-01-16 22 views
1

Можно загрузить различные параметры.yml на symfony? У меня есть многопользовательский APP SaaS, и я хочу, чтобы на каждом арендаторе были установлены параметры differ.yml (с конфигурационным DB) базы данных, чтобы отправить пользователя в правильную БД при действии входа.Symfony: Можно загрузить различные параметры.yml?

Большое спасибо!

EDIT: SOLVED!

Я решил, что организации различных конфигураций арендаторов в папках, как:

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 
.... 

И, изменив загрузчик kernelApp.php:

$ Loader-> нагрузки ($ this-> getRootDir (). '/ config/АРЕНДАТОР /config_'.$this->getEnvironment().'.yml');

Не знаю, хорошо ли это, но это нормально!

+0

Если вы хотите использовать доктрину Миграцию, вы столкнетесь с проблемой, так как она не зависит от этого конфиги , У меня есть решение, если вы хотите перейти к миграции доктрины, вы можете прочитать его здесь, и я говорю спасибо вам, потому что вы указали мне правильное направление использования нескольких баз данных и того же источника ;-) https: //stackoverflow.com/questions/45633339/symfony3-doctrine-migration-with-multiple-databases – rebru

ответ

0

У вас есть несколько возможностей здесь.

Если номер арендатора является постоянным или близким к нему (новые арендаторы добавляются очень редко), вы можете просто установить несколько соединений, как описано here. После этого вы можете получить необходимую EntityManager экземпляра по телефону

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

Даунсайда этого подхода заключается в том, что вы должны изменить свой config.yml каждый раз, когда вам нужно создать/обновить/удалить арендатор.

Но если вы хотите более гибкий подход вы можете реализовать свой собственный класс для управления соединениями с базой данных:

<?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

Спасибо @ Andrey. Я ищу диспетчерский запрос «Войти» на symfony в правильную БД. У меня много баз данных (по одному для каждого арендатора), но когда пользователь регистрируется на symfony, заказ атакует БД, дефинированный на parameters.yml. Просто я ищу загрузку правильных paratemers.yml в домене перед тем, как пользователь зайдет в систему symfony. (Извините за мой английский: /) –

+0

@CarlosCarmona - Похоже, вы хотите другой параметр.yml на основе запроса? Не произойдет. Все файлы конфигурации выполняются один раз, а затем кэшируются. Это всегда будет одинаковым для каждого запроса. Вам нужно будет сделать что-то вроде этого. – Cerad

+0

@ Andrey Я решил организовать различные конфигурации арендаторов в разных папках (app/config/tenantX), загружая среду appKernel de corret по домену. Он отлично работает! :) –

 Смежные вопросы

  • Нет связанных вопросов^_^