Nedaří se připojit k databázi (2)

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

Reaguji na toto vlákno (které už je zamčené).
Nette mi vyhodila stejnou výjimku „Configuration must be array, string or ArrayObject.“ Příčinou ale bylo to, že Environment::getConfig('database') vrací instanci třídy Config, která se v konstruktoru DibiConnection netestuje. Mírně jsem upravila konstruktor, ale zajímalo by mne, jestli není vhodnější způsob řešení. Děkuji za radu/názor.

// bootstrap.php
dibi::connect(Environment::getConfig('database'));

// DibiConnection.php, změněná část konstruktoru
// DSN string
if (is_string($config)) {
	parse_str($config, $config);

} elseif ($config instanceof ArrayObject || $config instanceof Config) {  // zmena
	$config = (array) $config;

} elseif (!is_array($config)) {
	throw new InvalidArgumentException('Configuration must be array, string or ArrayObject.');
}

/edit: Nette 1.0.0 pro PHP 5.2, Dibi 1.2 (revision 3b2ca19 released on 2009–09–18)

Editoval Tori (10. 9. 2010 0:33)

Blizzy
Člen | 149
+
0
-

Upravovat konstruktor určitě není správné řešení, lepší je upravit vstupní data.

Objekt Config lze převést na pole pomocí funkce toArray(). Pokud by byl problém v tomto, tak je to možné udělat následovně:

dibi::connect(Environment::getConfig('database')->toArray());

Problém může být i v tom, že config není načtený nebo načítá nějaké špatné informace (které nejsou pole), takže můžeš taky zkusit debugovat (přes dump) to, co skutečne do dibi::connect vstupuje za parametry.

Tori
Člen | 32
+
0
-

zkoušela jsem, do dibi::connect jde Object(Config) se správným nastavením z config.ini. Díky, tohle je určitě lepší řešení.

Blizzy
Člen | 149
+
0
-

Od 2010–04–22 (a4c5f32) dibi akceptuje jakýkoliv Traversable objekt jako config, tedy i Nette\Config\Config. Dalším řešením je tedy update, ten ale může způsobit zase jiné problémy.