Načtení databáze dle flagu v parametrech

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
bouc
Člen | 8
+
0
-

Ahoj, potřeboval bych se s vámi poradit. Ve své aplikaci se připojuji k 5 různým databázím. Ty mám definované v config.neon jako služby viz např:

parameters:
	forecastModelDatabaseInfo:
		driver: mysql
		database: meteo_1
		host: localhost
		user: root
		password: root

	forecastBackupDatabaseInfo:
		driver: mysql
		database: meteo_2
		host: localhost
		user: root
		password: root

services:
		forecastModelDatabase:
			class: DibiConnection
			create: dibi::connect(%forecastModelDatabaseInfo%)
			run: true

		forecastBackupDatabase:
			class: DibiConnection
			create: dibi::connect(%forecastBackupDatabaseInfo%)
			run: true

Modely mám také definované jako služby, např.:

		backupManualChangesModel:
			class: \Models\BackupManualChangesModel(@forecastBackupDatabase)
			autowired: false
		activePeriodsModel:
			class: \Models\ActivePeriodsModel(@serviceDatabase)

Jde o to, že bych potřeboval dle flagu, který mám definovaný v parametrech:

parameters:
	useBackupDatabase: TRUE

načítat pro jisté modely buď databázi forecastModelDatabase, pokud je tento flag FALSE, a pokud je TRUE, tak pro ty jisté modely používat databázi forecastBackupDatabase. Netuším ale moc, jak to udělat. Dokázal by mě prosím někdo navést správným směrem?

Jan Endel
Člen | 1016
+
0
-

Co takhle službu databaseResolver co si veme parametry z config neonu a bude implementovat getDatabase a použití v service:

class BackupManualChangesModel
{
	private $database;

	public function __construct(DatabaseResolver $databaseResolver)
	{
		$this->database = $databaseResolver->getDatabase();
	}
}

alespoň tak bych na to šel já.

bouc
Člen | 8
+
0
-

Jan Endel napsal(a):

Co takhle službu databaseResolver co si veme parametry z config neonu a bude implementovat getDatabase a použití v service:

class BackupManualChangesModel
{
	private $database;

	public function __construct(DatabaseResolver $databaseResolver)
	{
		$this->database = $databaseResolver->getDatabase();
	}
}

alespoň tak bych na to šel já.

Super, to je přesně ono, díky :).

class DatabaseResolver {

    private $useBackupDatabase;
    private $forecastModelDatabase;
    private $forecastBackupDatabase;

    /**
     * @param $useBackupDatabase flag zda se ma pouzivat backup databaze
     */
    public function __construct($useBackupDatabase, \DibiConnection $forecastModelDatabase, \DibiConnection $forecastBackupDatabase) {
        $this->useBackupDatabase = $useBackupDatabase;
        $this->forecastModelDatabase = $forecastModelDatabase;
        $this->forecastBackupDatabase = $forecastBackupDatabase;
    }

    /**
     * Služba vrací databázi dle konfigurace v neon
     */
    public function getDatabase() {
        if ($this->useBackupDatabase == TRUE) {
            return $this->forecastBackupDatabase;
        } else {
            return $this->forecastModelDatabase;
        }
    }
}