Co všechno za „magii“ se provádí při vytvoření Connection?

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

Ve své aplikaci se připojuji k vícero databázím, jejich konfiguraci tahám z jiného zdroje, než config.php. Jednotlivá připojení vytvářím přes

<?php
$connection = new Nette\Database\Connection(...)
?>

Rád bych, aby nová připojení měla nachlup stejné vlastnosti, jako to „defaultně zabudované“. Co všechno se provádí při vytváření originálního Connection, registrovaného v configu?

jtousek
Člen | 951
+
0
-

Důležité mi připadá jen zaregistrování do DebugBaru abys viděl SQL dotazy v development režimu. Jak přesně se to dělá si nepamatuju. :-)

Tharos
Člen | 1030
+
0
-

Děje se to tady.

thunderbuff
Člen | 164
+
0
-

Díky za doporučení. Zatím mám tohle:

<?php
$connection = new Connection($dsn, $user, $password)
$panel = new \Nette\Database\Diagnostics\ConnectionPanel;
Debugger::$bar->addPanel($panel);
$connection->onQuery[] = callback($panel, 'logQuery');
$connection->setCacheStorage($this->storage); // služba @cacheStorage
Nette\Diagnostics\Debugger::$blueScreen->addPanel(array('Nette\Database\Diagnostics\ConnectionPanel::renderException'));

?>

jen jak vyrobit reflexi mi zatím uniká :-)

Filip Procházka
Moderator | 4668
+
0
-

A proč to děláš „ručně“, když to za tebe může udělat Nette?

thunderbuff
Člen | 164
+
0
-

HosipLan napsal(a):

A proč to děláš „ručně“, když to za tebe může udělat Nette?

Mám jednu „běžnou“ nette databázi. Pak mám desítky dalších databází, jejich konfigurace je uložená v tabulce v té „běžné“ databázi. Jelikož je jich opravdu hodně a jejich konfigurce se často mění, není možné udržovat je v configu, proto potřebuji takovéhle nehezké řešení.

hrach
Člen | 1838
+
0
-

Reflexi vytvoris proste instancovanim tridy a setterem ji predas connection. Nic zvlastniho,viz testy

thunderbuff
Člen | 164
+
0
-

Díky všem za tipy, finální verze vypadá takto:

<?php

$connection = $this->new Connection($dsn, $u, $p)


		$panel = new \Nette\Database\Diagnostics\ConnectionPanel;
		Debugger::$bar->addPanel($panel);
		$connection->onQuery[] = callback($panel, 'logQuery');
		$connection->setCacheStorage($this->storage);
		$connection->setDatabaseReflection(new \Nette\Database\Reflection\ConventionalReflection());

		$this->connections[$connectionName] = $connection;


?>

Editoval thunderbuff (8. 10. 2012 19:16)

thunderbuff
Člen | 164
+
0
-

Výše zmíněný kód neloguje v produkčním módu databázové chyby, ale v development funguje. Nevíte, čím by to mohlo být?

hrach
Člen | 1838
+
0
-

Co znamena neloguje???

thunderbuff
Člen | 164
+
0
-

hrach napsal(a):

Co znamena neloguje???

To znamená, že pokud dojde k nějaké chybě (např kolize cizího klíče), tak se nevytvoří žádný záznam v error logu, ani se neuloží html soubor s exception. Přikládám bootstrap:

<?php

define ("DEVELOPMENT", 0);

use Nette\Application\Routers\Route;
use Nette\Diagnostics\Debugger;
use Nette\Forms\Container;

// Load Nette Framework
require LIBS_DIR . '/Nette/loader.php';


// Configure application
$configurator = new Nette\Config\Configurator;

// Enable Nette Debugger for error visualisation & logging

if (DEVELOPMENT) {
	$configurator->setDebugMode(true);
}
else {
	$configurator->setDebugMode(false);
}

define('LOGS_DIR', APP_DIR . '/../log');

$configurator->enableDebugger(LOGS_DIR);


// Enable RobotLoader - this will load all classes automatically

if (!is_dir(__DIR__ . '/../temp/' . APP_INSTANCE)) {
	mkdir(__DIR__ . '/../temp/' . APP_INSTANCE);
}


$configurator->setTempDirectory(__DIR__ . '/../temp/' . APP_INSTANCE);
$configurator->createRobotLoader()
	->addDirectory(APP_DIR)
	->addDirectory(LIBS_DIR)
	->register();


Debugger::timer();

Debugger::$bar->addPanel(new \NetteExtras\XDebugHelper('phpstorm'));

// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config_' . APP_INSTANCE . '.neon');
$container = $configurator->createContainer();

// Setup router
$container->router[] = new Route('index.php', 'Welcome:Dashboard:Default', Route::ONE_WAY);
$container->router[] = new Route('<module>/<presenter>/<action>[/<id>]', array(
	'module'    => 'Welcome',
	'presenter' => 'Dashboard',
	'action'    => 'Default',
	'id'        => null,
));


// Configure and run the application!
$container->application->errorPresenter = 'Error';
$container->application->run();


?>

Editoval thunderbuff (9. 10. 2012 0:43)