2017-01-16 2 views
1

symfony에서 다른 parameters.yml을로드 할 수 있습니까? 나는 SaaS multitenant APP를 보유하고 있으며 로그인 액션에서 사용자를 올바른 DB로 파견하기 위해 각 세입자별로 기본 DB를 가진 parameters.yml을 기본으로 사용하고 싶습니다.Symfony : 다른 parameters.yml을로드 할 수 있습니까?

감사합니다.

EDIT : SOLVED!

$ loader->로드 ($ this-> getRootDir (: kernelApp.php의 로더를 수정,

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

그리고 :

나는이 같은 폴더에 다른 세입자 구성을 배열 해결)./config/임차인 /config_'.$this->getEnvironment().'.yml ');

좋은 연습인지 잘 모르겠지만 잘 작동합니다!

+0

, 당신은 문제로 실행하겠습니다을 . 독트린 마이그레이션으로 이동하려면 솔루션을 가지고 있습니다. 여기에서 읽을 수 있습니다. 여러 데이터베이스와 동일한 소스를 사용하는 올바른 방향으로 지적했기 때문에, 감사드립니다. https : //stackoverflow.com/questions/45633339/symfony3-doctrine-migration-with-multiple-databases – rebru

답변

0

여기에는 여러 가지 가능성이 있습니다.

세입자의 번호가 상수이거나 그와 가까운 경우 (새로운 세입자가 거의 추가되지 않는 경우), here과 같이 여러 연결을 설정할 수 있습니다. 그 후 당신이이 방법의

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

단점을 호출하여 필요한 EntityManager 인스턴스를 얻을 수 있습니다 당신이 당신의 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

Thanks @ Andrey. symfony에서 올바른 DB로 "로그인"명령을 찾고 있습니다. 필자는 많은 데이터베이스 (각 임차인마다 하나씩)를 가지고 있지만 사용자가 심포니에 로그온 할 때 명령은 parameters.yml을 정의한 DB를 atacks합니다. 사용자가 symfony에 로그인하기 전에 도메인에서 올바른 paratemers.yml을로드하기를 찾고 있습니다. (내 영어로는 죄송합니다.)/ –

+0

@CarlosCarmona - 요청에 따라 다른 parameter.yml을 원한다고 생각하십니까? 그런 일은 없을 것이다. 모든 설정 내용은 한 번 수행 된 다음 캐시됩니다. 각 요청마다 항상 동일합니다. 이 답이 제시하는 것과 같은 것을해야 할 것입니다. – Cerad

+0

@Andrey 나는 (app/config/tenantX)의 differents 폴더에 differents 세입자 구성을 정렬하고 도메인 별 appKernel 환경에 의해로드하여 해결했습니다. 그것은 잘 작동합니다! :) –

관련 문제